Recursion 计算二叉搜索树的高度

Recursion 计算二叉搜索树的高度,recursion,tree,binary-search-tree,Recursion,Tree,Binary Search Tree,给定以下代码: private int getHeight(Node root){ if(root == null){ return 0; } else{ int leftHeight = getHeight(root.leftChild); int rightHeight = getHeight(root.rightChild); if(leftHe

给定以下代码:

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

我只是不明白它是如何贯穿整件事的

详细的解释将是伟大的!
谢谢

让我们先总结一下我们掌握的要素

停止条件

if(root == null){
        return 0;
}
if(leftHeight > rightHeight){
    return leftHeight + 1;
}
else{
    return rightHeight + 1;
}
这意味着我们在一个不存在的孩子身上。例如,在树中,“2”元素有一个右子元素,但没有左子元素。你什么时候打电话

int leftHeight = getHeight(root.leftChild);
root.leftChild将等于null。因此我们必须返回0,因为该子级不存在

递归性

int leftHeight = getHeight(root.leftChild);
int rightHeight = getHeight(root.rightChild);
对于树中的每个元素,您希望获得其左侧和右侧的元素数。因此,您正在调用同一个函数,并将参数指定为left child或right child。如果该元素不存在,则进入停止条件,并返回0。如果有一个元素,我们要检查相同的内容,并以相同的方式继续。这就解释了为什么你不能仅仅停留在“1”和“9”上,然后继续直到你遇到一片叶子

高度计算

if(root == null){
        return 0;
}
if(leftHeight > rightHeight){
    return leftHeight + 1;
}
else{
    return rightHeight + 1;
}
我们要计算树的高度。我们之前解释过,leftHeight将包含其左侧实际元素下的元素数,而rightHeight将包含其右侧的元素数。如果左侧的图元较多,则表示左侧的高度大于右侧的高度。然后,我们返回这个计算出的高度,并向其中添加1。我们加1是因为我们所在的元素也是这个高度的一部分:我们想告诉我们的父元素,它下面的高度是它的子元素(1),加上它的子元素下面的所有元素

示例

现在,我们已经解释了所有内容,让我们尝试一下您的树示例

函数将在“4”元素上被调用,然后一直到树的底部。让我们从你的“3”元素开始。因为它的左侧或右侧没有任何子级,所以leftHeight和rightHeight将分别等于0。这意味着此元素下的高度为0。然后我们只返回1,对应于“3”元素

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

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

我们现在到另一边去吧。我们有“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”是树的根元素,函数第一次在树上被调用。最后,我们知道你的树的高度是4。

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

停止条件

if(root == null){
        return 0;
}
if(leftHeight > rightHeight){
    return leftHeight + 1;
}
else{
    return rightHeight + 1;
}
这意味着我们在一个不存在的孩子身上。例如,在树中,“2”元素有一个右子元素,但没有左子元素。你什么时候打电话

int leftHeight = getHeight(root.leftChild);
root.leftChild将等于null。因此我们必须返回0,因为该子级不存在

递归性

int leftHeight = getHeight(root.leftChild);
int rightHeight = getHeight(root.rightChild);
对于树中的每个元素,您希望获得其左侧和右侧的元素数。因此,您正在调用同一个函数,并将参数指定为left child或right child。如果该元素不存在,则进入停止条件,并返回0。如果有一个元素,我们要检查相同的内容,并以相同的方式继续。这就解释了为什么你不能仅仅停留在“1”和“9”上,然后继续直到你遇到一片叶子

高度计算

if(root == null){
        return 0;
}
if(leftHeight > rightHeight){
    return leftHeight + 1;
}
else{
    return rightHeight + 1;
}
我们要计算树的高度。我们之前解释过,leftHeight将包含其左侧实际元素下的元素数,而rightHeight将包含其右侧的元素数。如果左侧的图元较多,则表示左侧的高度大于右侧的高度。然后,我们返回这个计算出的高度,并向其中添加1。我们加1是因为我们所在的元素也是这个高度的一部分:我们想告诉我们的父元素,它下面的高度是它的子元素(1),加上它的子元素下面的所有元素

示例

现在,我们已经解释了所有内容,让我们尝试一下您的树示例

函数将在“4”元素上被调用,然后一直到树的底部。让我们从你的“3”元素开始。因为它的左侧或右侧没有任何子级,所以leftHeight和rightHeight将分别等于0。这意味着此元素下的高度为0。然后我们就朱