使用递归的红黑树高度

时间:2013-11-24 05:22:08

标签: c++ recursion red-black-tree

我有以下方法来获取红黑树的高度,这是有效的(我发送根)。现在我的问题是,这是如何工作的?我已经绘制了一棵树,并尝试逐步执行每个递归调用,但我不能将它拉下来。 我知道代码正在做什么的一般概念,它正在经历所有的叶子并进行比较,但任何人都能对此做出明确的解释吗?

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;
    }
}

4 个答案:

答案 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.

以上算法的说明如下:

HeightTree

(图片由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

我希望这对你的学习曲线至少有所作为。如果你还有疑问的话,可以在纸上画出一些样本树,以便更好地理解。