繁体   English   中英

使用递归的红黑树高度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM