计算二叉搜索树的高度

时间:2016-03-11 00:06:24

标签: recursion tree binary-search-tree

给出以下代码:

.card-list:container(width >= 100px) {
  color: yellow;
}

我不明白的是这两行:

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);的节点并停在那里。

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

详细说明会很棒! 谢谢!

1 个答案:

答案 0 :(得分:0)

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

停止条件

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将包含左侧实际元素下的元素数量,右侧是右侧的元素数量。如果左侧有更多元素,则表示左侧的高度大于右侧的高度。然后我们返回这个计算出的高度,然后加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&gt; 0,所以我们将返回rightChild(2)的值,并为“1”元素添加一个。

  1
   \ 
    \
     2
      \
       \
        3

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

  1 
   \ 
    \ 8
     2
      \
       \
        3

“8”的父元素是“9”。这个元素在右边没有子元素,所以rightHeight将为0.但它左边有一个子节点,“8”,它返回给他1. 1&gt; 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。