求二叉树的高度
Finding the height of the binary tree
给出求二叉树高度的代码:
/*
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
并且高度为 5 因为 3->5->4->3->2
?
我很难理解这些行的递归:
int left = height(root.left);
int right = height(root.right);
我对这些行的理解是 left
转到最左边的节点,而 right
转到最右边的节点。
提前致谢!
基本上你有一个简单的算法描述,你几乎按字面意思实现它以获得递归解决方案。你从这样的事情开始:
- 没有节点的树的高度为 0
- 具有任意数量节点的树的高度为 1 + 左子树和右子树之间的最大高度
在递归算法中,你总是有一个递归步骤(在这种情况下是第二步)和一个停止递归的基本情况(没有节点的树)。
所以基本上是根为 3 的树的高度
3
/ \
5 2
/ \ /
1 4 6
/
7
是1+从3开始的两棵子树的高度之间的最大值,eg:
5 2
/ \ /
1 4 6
/
7
这就是
所做的
int left = height(root.left);
int right = height(root.right);
然后递归,高度为
5
/ \
1 4
是子树高度之间的最大值
1 4
等等。
基本上在每个递归步骤中,您将执行路径分成 2 部分来计算子树的高度,当两者都已计算时,您取较大的高度,加 1 和 return 该值。
具体回答您的问题:
1) 您突出显示的两行:
int left = height(root.left);
int right = height(root.right);
树的高度不加1。相反,他们将左侧 sub-tree 和右侧 sub-tree 的高度分配给两个单独的变量。
下面赋值后的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);
不完全去只是树的最左边和最右边的节点,它们访问了根节点左边children的所有节点和对 children 在根节点上。最终将访问所有节点。
用递归解决通常是一种优雅的方法,但将其视为解决较小的问题并构建解决方案会有所帮助,而不是试图在脑海中描绘出整个解决方案。
让我们运行通过您发布的示例。
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
使用递归,首先找出2下方的children的高度,即0,即可计算出高度。
求子树的高度:
2
它会将下面的子树的高度加 1,即 0,从而使我们的高度为 1。
然后子树的高度加1:
3
/
2
给我们 1 + 从 2 = 2 开始的子树的高度。
这将继续向上子树:
4
/
3
/
2
1 + 从 3 开始的子树的高度 = 1 + (2) = 3
然后:
5
/ \
1 4
/
3
/
2
最后是主树:
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
递归算法通过查找较小子树的高度来解决查找树的高度的问题。
给出求二叉树高度的代码:
/*
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
并且高度为 5 因为 3->5->4->3->2
?
我很难理解这些行的递归:
int left = height(root.left);
int right = height(root.right);
我对这些行的理解是 left
转到最左边的节点,而 right
转到最右边的节点。
提前致谢!
基本上你有一个简单的算法描述,你几乎按字面意思实现它以获得递归解决方案。你从这样的事情开始:
- 没有节点的树的高度为 0
- 具有任意数量节点的树的高度为 1 + 左子树和右子树之间的最大高度
在递归算法中,你总是有一个递归步骤(在这种情况下是第二步)和一个停止递归的基本情况(没有节点的树)。
所以基本上是根为 3 的树的高度
3
/ \
5 2
/ \ /
1 4 6
/
7
是1+从3开始的两棵子树的高度之间的最大值,eg:
5 2
/ \ /
1 4 6
/
7
这就是
所做的int left = height(root.left);
int right = height(root.right);
然后递归,高度为
5
/ \
1 4
是子树高度之间的最大值
1 4
等等。
基本上在每个递归步骤中,您将执行路径分成 2 部分来计算子树的高度,当两者都已计算时,您取较大的高度,加 1 和 return 该值。
具体回答您的问题:
1) 您突出显示的两行:
int left = height(root.left);
int right = height(root.right);
树的高度不加1。相反,他们将左侧 sub-tree 和右侧 sub-tree 的高度分配给两个单独的变量。
下面赋值后的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);
不完全去只是树的最左边和最右边的节点,它们访问了根节点左边children的所有节点和对 children 在根节点上。最终将访问所有节点。
用递归解决通常是一种优雅的方法,但将其视为解决较小的问题并构建解决方案会有所帮助,而不是试图在脑海中描绘出整个解决方案。
让我们运行通过您发布的示例。
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
使用递归,首先找出2下方的children的高度,即0,即可计算出高度。
求子树的高度:
2
它会将下面的子树的高度加 1,即 0,从而使我们的高度为 1。
然后子树的高度加1:
3
/
2
给我们 1 + 从 2 = 2 开始的子树的高度。
这将继续向上子树:
4
/
3
/
2
1 + 从 3 开始的子树的高度 = 1 + (2) = 3
然后:
5
/ \
1 4
/
3
/
2
最后是主树:
3
/ \
5 2
/ \ /
1 4 6
/ /
3 7
/
2
递归算法通过查找较小子树的高度来解决查找树的高度的问题。