嘿伙计们,我刚刚开始学习二进制树,最近我被问到了这个问题。由于我令人难以置信的糟糕实施以及对问题的理解不充分,我根本不知道如何解决这个问题。请帮帮我!!!
如果对于任何节点u,具有n个节点的二叉树T被称为h平衡 在T中,其两个子树的高度之间的差异最多为h,其中h> = 0 是一个整数。假设空树的高度为-1。假设每个节点都有 三个字段:u.lc指向你的左子,u.lc = NULL如果你没有左边 儿童;如果你没有合适的孩子,u.rc指向你的右孩子,u.rc = NULL; u.height应设置为以u为根的树的高度。
(a)如果r指向树的根,则用伪代码设计算法 (或C / C ++)在u:height中填充每个节点u的高度。
(b)假设每个节点u的高度存储在u.height中,写一个算法 检查T是否为h平衡。 (提示:修改(a)中设计的算法)
答案 0 :(得分:4)
这甚至不是伪代码,但应该在路上帮助你。
如果您更正式地陈述其条件,通常会使问题更加清晰:
A)
b)中
正如您所看到的,这两个问题都遵循相同的模式:一个叶子案例,以及一个依赖于两个子树的案例。
这是二叉树递归的一般形式:
void recurse(t)
{
if (t is a leaf, i.e. an empty tree)
{
handle the leaf case
}
else
{
do something that depends on
recurse(left subtree of t)
and
recurse(right subtree of t)
}
}
我将剩下的解决方案作为练习。
答案 1 :(得分:1)
这是一种算法。假设节点结构声明如下:
struct Node {
Node *l; // left child
Node *r; // right child
int h; // subtree height
};
然后
void CalcHeights(Node *n)
{
if(n != NULL)
{
CalcHeights(n->l); // calc height in subtrees
CalcHeights(n->r);
int hl = n->l ? n->l->h : -1; // read calculated heights
int hr = n->r ? n->r->h : -1;
n->h = (hl > hr ? hl : hr) + 1; // get the bigger one plus 1
}
}
bool TestBalanced(Node const *n, int h)
{
if(n != NULL)
{
if(! TestBalanced(n->l, h) || ! TestBalanced(n->r, h))
return false; // unbalanced subtree...
int hl = n->l ? n->l->h : -1; // get subtrees heights
int hr = n->r ? n->r->h : -1;
return abs(hl - hr) <= h; // test the difference against H
}
return true; // empty tree is balanced
}