【问题标题】:Finding the height of the binary tree求二叉树的高度
【发布时间】:2015-12-31 10:13:14
【问题描述】:

给出求二叉树高度的代码:

/*
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); ---> 一直到 leftmost 节点?? 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 转到最右边的节点。

提前致谢!

【问题讨论】:

  • 我建议您在调试器中单步调试代码。这是一个非常简单的函数,在你看到代码如何实际运行之前,我认为你无法完全理解它。
  • 您已经计算出,如果left 只转到最左边的节点,则此功能将不起作用,但确实有效,因此您知道这不可能是正确的。

标签: java binary-search-tree


【解决方案1】:

基本上,您有一个简单的算法描述,并且您几乎按字面意思实现它以获得递归解决方案。您可以从以下内容开始:

  • 没有节点的树的高度为 0
  • 具有任意数量节点的树的高度为 1 + 左子树和右子树之间的最大高度

在递归算法中,您总是有一个递归步骤(在这种情况下是第二个)和一个停止递归的基本情况(没有节点的树)。

所以基本上是根为 3 的树的高度

     3
   /   \
  5     2
 / \    /
1   4  6
      /
     7

是从3开始的两个子树高度之间的1+最大值,例如:

   5              2
  / \            /
 1   4          6
               /
              7  

原来是这样的

int left = height(root.left);
int right = height(root.right);

然后递归,高度为

   5
  / \
 1   4

子树高度之间的最大值

 1   4

等等。

基本上在每个递归步骤中,您将执行路径分成 2 份来计算子树的高度,当两者都计算完毕后,您取较大的高度,加 1 并返回值。

【讨论】:

    【解决方案2】:

    具体回答您的问题:

    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
    

    给我们 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
    

    递归算法通过查找较小子树的高度来解决查找树高度的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多