[英]Red-Black Tree Height using Recursion
我有以下几种方法来获取一棵红黑树的高度,并且这种方法有效(我发送了根)。 现在我的问题是,这如何工作? 我已经绘制了一棵树,并尝试对每个递归调用都按照此步骤进行操作,但是我无法完成。 我知道代码在做什么的一般想法,它贯穿所有叶子并进行比较,但是有人可以对此进行清晰的解释吗?
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;
}
}
好了,找到任何二叉树(无论是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),我们完成了。
这是基本的递归算法。
从基本情况开始,如果根本身为null
,则树的高度为-1
因为树不存在。
现在想象一下,如果该节点是其根,那么在任何节点上树的高度将是多少?
它只是左子树或右子树的高度的最大值(因为您正试图找到最大可能的高度,所以您必须取2的较大值)并为其添加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
我希望这至少对您的学习曲线有所帮助。 如果仍有疑问,请在纸上画出一些示例树,以更好地理解它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.