查找二叉树的高度

时间:2015-12-31 00:08:59

标签: java binary-search-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
由于3->5->4->3->2

的高度将 5

我很难理解这些行的递归:

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

我对这些行的理解是left转到最左边的节点,而right转到最右边的节点。

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

所以基本上树的高度与根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

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