给出以下代码:
.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);
的节点并停在那里。
我只是不明白它是如何遍历整个事情的。
详细说明会很棒! 谢谢!
答案 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。