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。然后我们就朱