给出用于查找二叉树高度的代码:
/*
class Node
int data;
Node left;
Node right;
*/
int height(Node root)
{
if(root == null){
return 0;
}
else{
int left = height(root.left);
int right = height(root.right);
if(left > right){
return 1 + left;
}
else{
return 1 + right;
}
}
}
示例是:
3
/ \
5 2
/ \ /
1 4 6
/
7
且身高 4 ,因为3->2->6->7
我在这里理解递归过程时遇到了很大麻烦。我很感激任何向我解释以下问题的人:
1)遍历树时,请在每次访问节点时执行以下两行添加1 ?更大的问题:它是如何运作的?
int left = height(root.left);
int right = height(root.right);
2)我理解正确吗?:
int left = height(root.left);
--->直到最左边节点?
int right = height(root.right);
--->直到最右边节点?
如果我有以下树,会发生什么:
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
由于3->5->4->3->2
?,的高度将 5
我很难理解这些行的递归:
int left = height(root.left);
int right = height(root.right);
我对这些行的理解是left
转到最左边的节点,而right
转到最右边的节点。
提前致谢!
答案 0 :(得分:3)
基本上你有一个简单的算法描述,你几乎字面上实现它来获得递归解决方案。你可以从以下内容开始:
在递归算法中,你总是有一个递归步骤(在这种情况下是第二个)和一个停止递归的基本情况(没有节点的树)。
所以基本上树的高度与根3
3
/ \
5 2
/ \ /
1 4 6
/
7
是从3开始的两个子树的高度之间的最大值,例如:
5 2
/ \ /
1 4 6
/
7
这就是
所做的int left = height(root.left);
int right = height(root.right);
然后递归,
的高度 5
/ \
1 4
是子树高度之间的最大值
1 4
等等。
基本上在每个递归步骤中,您将执行路径拆分为2以计算子树的高度,当计算两者时,您采用更高的高度,添加1并返回值。
答案 1 :(得分:0)
具体回答您的问题:
1)您突出显示的两行:
int left = height(root.left);
int right = height(root.right);
不要在树的高度加1。相反,他们将左子树和右子树的高度分配给两个单独的变量。
分配后的以下if-then-else-branch是将高度加1的代码:
if(left > right) {
return 1 + left;
} else {
return 1 + right;
}
2)两个递归调用:
int left = height(root.left);
int right = height(root.right);
不完全转到只是树的最左边和最右边的节点,它们访问根节点的左子节点和根节点上的右子节点的所有节点。最终将访问所有节点。
使用递归求解通常可以是一种优雅的方法,但它有助于将其视为解决较小的问题并构建解决方案,而不是试图描绘整个解决方案。
让我们来看看你发布的例子。
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
使用递归,通过首先找出低于2的孩子的高度(即0)来计算高度。
要查找子树的高度:
2
它会在下面的子树高度上加1,即0,给我们一个高度为1。
然后将1添加到子树的高度:
3
/
2
从2 = 2开始给我们1 +高度的子树。
这将继续使用子树:
4
/
3
/
2
1 +子树的高度从3 = 1 +(2)= 3
开始然后:
5
/ \
1 4
/
3
/
2
最后是主树:
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
递归算法通过查找较小子树的高度来解决查找树高的问题。