【问题标题】:Calculating the height of the binary search tree计算二叉搜索树的高度
【发布时间】:2016-03-11 00:06:23
【问题描述】:

给定以下代码:

private int getHeight(Node root){
        if(root == null){
            return 0;
        }
        else{
            int leftHeight = getHeight(root.leftChild);
            int rightHeight = getHeight(root.rightChild);

            if(leftHeight > rightHeight){
                return leftHeight + 1;
            }
            else{
                return rightHeight + 1;
            }

        }
    }

我不明白的是这两行:

int leftHeight = getHeight(root.leftChild);
int rightHeight = getHeight(root.rightChild);

它是如何递归计算树的高度的?如果一棵树看起来像这样:

     4
    / \
   /   \
  1     9
   \   /
    \ 8
     2
      \
       \
        3

这两行是怎么计算的??究竟递归如何在穿过树时添加1

我的看法是:

int leftHeight = getHeight(root.leftChild); 使用1 转到节点并停在那里。

int rightHeight = getHeight(root.rightChild); 使用9 转到节点并停在那里。

我只是不明白它是如何遍历整个事物的。

详细的解释会很棒! 谢谢!

【问题讨论】:

    标签: recursion tree binary-search-tree


    【解决方案1】:

    我们先总结一下我们拥有的元素。

    停止条件

    if(root == null){
            return 0;
    }
    

    这意味着我们在一个不存在的孩子身上。例如,在您的树中,“2”元素确实有一个右孩子,但没有左孩子。所以你什么时候打电话

    int leftHeight = getHeight(root.leftChild);
    

    root.leftChild 将等于 null。所以我们必须返回 0,因为这个孩子不存在。

    递归性

    int leftHeight = getHeight(root.leftChild);
    int rightHeight = getHeight(root.rightChild);
    

    对于你的树的每个元素,你想获得它左边和右边的元素的数量。因此,您正在调用相同的函数,将参数传递给左孩子或右孩子。如果这个元素不存在,我们进入停止条件,返回0。如果有元素,我们要检查同样的事情,并以同样的方式继续。这就解释了为什么你不能只停留在“1”和“9”,然后继续直到遇到一片叶子。

    高度计算

    if(leftHeight > rightHeight){
        return leftHeight + 1;
    }
    else{
        return rightHeight + 1;
    }
    

    我们要计算树的高度。我们之前解释过 leftHeight 将包含其左侧实际元素下的元素数,而 rightHeight 在其右侧。如果左边有更多的元素,这意味着左边的高度大于右边的高度。然后我们返回这个计算出的高度,并给它加 1。我们加 1 是因为我们所在的元素也是这个高度的一部分:我们想告诉我们的父元素,它下面的高度是它的子元素 (1),加上它的子元素下面的所有元素。

    示例

    现在我们已经解释了一切,让我们试试你的树示例。

    该函数将在您的“4”元素上调用,然后一直到达树的底部。让我们从您的“3”元素开始。因为左边或右边都没有子元素,所以leftHeight和rightHeight都等于0。也就是说这个元素下的高度为0。然后我们只返回1,对应“3”元素.

            3
    

    然后我们到达“2”。 “2”的左边没有子元素,所以 leftHeight 将等于 0。但 rightChild 将等于 1,因为“3”元素返回了此信息。 1 > 0,所以我们将返回rightChild(1)的值,并为“2”元素加一。

         2
          \
           \
            3
    

    然后我们到达“1”元素。相同的概念:左边没有孩子,右边有 1。 leftHeight 等于 0,rightHeight 为 2,因为“2”元素返回了这个信息。 2 > 0,所以我们将返回rightChild(2)的值,并为“1”元素加一。

      1
       \ 
        \
         2
          \
           \
            3
    

    我们现在去另一边。我们有“8”元素。它没有子元素,并且会像“3”元素一样。然后它会为自己返回 0 + 1。

      1 
       \ 
        \ 8
         2
          \
           \
            3
    

    “8”的父元素是“9”。这个元素右边没有孩子,所以 rightHeight 为 0。但是左边有一个孩子,“8”,它返回了 1。1 > 0,所以我们将返回 leftChild (1) 的值,并且为 9 加一个。

      1     9
       \   /
        \ 8
         2
          \
           \
            3
    

    然后我们到达最后一个元素“4”。它右边有一个孩子,“9”,左边有一个孩子“1”。 rightHeight 将是 2,因为“9”返回了这个值。 leftHeight 将为 3,因为“1”返回此值。 3 > 2,所以我们将返回 leftHeight (3) 的值,并为“4”元素加一。

         4
        / \
       /   \
      1     9
       \   /
        \ 8
         2
          \
           \
            3
    

    “4”是你的树的根元素,你的函数第一次被调用。最后,我们知道你的树的高度是 4。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2010-10-09
      • 2010-12-24
      相关资源
      最近更新 更多