我有以下方法来获取红黑树的高度,这是有效的(我发送根)。现在我的问题是,这是如何工作的?我已经绘制了一棵树,并尝试逐步执行每个递归调用,但我不能将它拉下来。 我知道代码正在做什么的一般概念,它正在经历所有的叶子并进行比较,但任何人都能对此做出明确的解释吗?
int RedBlackTree::heightHelper(Node * n) const{
if ( n == NULL ){
return -1;
}
else{
return max(heightHelper(n->left), heightHelper(n->right)) + 1;
}
}
int RedBlackTree::max(int x, int y) const{
if (x >= y){
return x;
}
else{
return y;
}
}
答案 0 :(得分:3)
那么,找到任何二叉树(无论是BST,AVL树,红黑等)的高度的一般算法如下
For the current node:
if(node is NULL) return -1
else
h1=Height of your left child//A Recursive call
h2=Height of your right child//A Recursive call
Add 1 to max(h1,h2) to account for the current node
return this value to parent.
以上算法的说明如下:
(图片由Wikipedia.org提供)
答案 1 :(得分:1)
此代码将返回任何二叉树的高度,而不仅仅是红黑树。它以递归方式工作。
我发现这个问题在过去很难想到,但是如果我们想象我们有一个返回子树高度的函数,我们可以很容易地用它来计算完整树的高度。我们通过计算每一边的高度,取最大值并加一个来做到这一点。
树的高度要么经过左边或右边的分支,所以我们可以取最大值。然后我们为root添加1。
处理没有树的基本情况(-1),我们就完成了。
答案 2 :(得分:1)
这是一种基本的递归算法。
从基本情况开始,如果根本身为null
,则树的高度为-1
,因为树不存在。
现在想象一下,如果这个节点是它的根,那么在任何节点上树的高度是多少?
它只是左子树或右子树的高度的最大值(因为你试图找到最大可能的高度,所以你必须取2的大部分)并为它添加一个1节点本身。
就是这样,一旦你遵循这个,你就完成了!
答案 3 :(得分:1)
作为递归函数,它计算每个子节点的高度,使用该结果通过向其添加+ 1
来计算当前节点的高度。任何节点的高度始终是两个子节点的最大高度+ 1.单节点情况可能是最容易理解的,因为它的高度为零(0)。
A
这里的调用堆栈如下所示:
height(A) =
max(height(A->left), height(A->right)) + 1
由于left和right都为null,因此都返回(-1)
,因此会减少到
height(A) = max (-1, -1) + 1;
height(A) = -1 + 1;
height(A) = 0
稍微复杂的版本
A
B C
D E
我们关心的递归调用是:
height(A) =
max(height(B), height(C)) + 1
height(B) =
max(height(D), height(E)) + 1
我们从第一个例子中已经知道的单个节点D,E和C的高度为零(它们没有子节点)。因此以上所有内容都缩减为
height(A) = max( (max(0, 0) + 1), 0) + 1
height(A) = max(1, 0) + 1
height(A) = 1 + 1
height(A) = 2
我希望这对你的学习曲线至少有所作为。如果你还有疑问的话,可以在纸上画出一些样本树,以便更好地理解。