【问题标题】:Red-Black Tree Height using Recursion使用递归的红黑树高度
【发布时间】:2013-12-08 21:35:58
【问题描述】:

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

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

【问题讨论】:

  • 想想你看到的 + 1 挂在递归调用结果的末尾,以及它对 当前 调用的调用者的贡献。
  • 首先尝试用非常简单的树来模拟算法的工作。如果只有根存在,它是如何工作的?它在具有树节点的树中如何工作?
  • 您似乎不知道,您不必像std::max那样创建自己的max函数。

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


【解决方案1】:

嗯,求任意二叉树(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提供)

【讨论】:

    【解决方案2】:

    此代码将返回任何二叉树的高度,而不仅仅是红黑树。它以递归方式工作。

    我发现这个问题在过去很难考虑,但是如果我们想象我们有一个返回子树高度的函数,我们可以很容易地使用它来计算一棵完整树的高度。我们通过计算每一边的高度、取最大值并加一来做到这一点。

    树的高度要么穿过左分支,要么穿过右分支,所以我们可以取其中的最大值。然后我们为根添加 1。

    处理无树 (-1) 的基本情况,我们就完成了。

    【讨论】:

      【解决方案3】:

      这是一个基本的递归算法。

      从基本情况开始,如果根本身是null,则树的高度是-1,因为树不存在。

      现在想象在任何节点上,如果这个节点是它的根,那么树的高度是多少?

      它只是左子树或右子树高度的最大值(因为你试图找到最大可能的高度,所以你必须取 2 中的较大者)并添加一个 1 来合并节点本身。

      就是这样,一旦你按照这个,你就完成了!

      【讨论】:

        【解决方案4】:

        作为一个递归函数,它计算每个子节点的高度,使用该结果通过添加+ 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
        

        我希望这至少能对您的学习曲线有所帮助。如果您仍有疑问,请在纸上画出一些样本树,以便更好地理解。

        【讨论】:

          猜你喜欢
          • 2013-02-09
          • 2012-12-01
          • 1970-01-01
          • 2017-09-17
          • 1970-01-01
          • 2018-09-16
          • 1970-01-01
          • 2013-02-13
          • 2015-11-17
          相关资源
          最近更新 更多