我使用下面给出的方法来计算二叉树的高度,
int height(Node root)
{
if (root == null)
return 0;
else
{
int lheight = height(root.left);
int rheight = height(root.right);
if (lheight > rheight)
return(lheight+1);
else return(rheight+1);
}
}
这返回lheight = 2.最初我认为每次递归调用height(root.left)时lheight会增加1。但后来我添加了一个printf语句并再次运行,
int height(Node root)
{
if (root == null)
return 0;
else
{
int lheight = height(root.left);
System.out.print(lheight);
int rheight = height(root.right);
if (lheight > rheight)
return(lheight+1);
else return(rheight+1);
}
}
printf语句打印此0 1 0 2 0.每次递归调用时lheight的值如何变化?我不是在寻找新的解决方案。我知道这可以通过多种方式完成。我只是想了解这段代码中发生了什么。这是二叉树图像链接。 Binary tree
答案 0 :(得分:1)
将count作为参数传入方法,最初设置为0或1(取决于您的偏好),然后在每次递归调用方法时增加它。
编辑:说实话,我没有测试过这段代码,所以我无法弄清楚你应该如何改变高度值。像这样的感觉将是无限递归。无论如何,这是跟踪递归计数的基本思路:
int height(Node root, int lCount, int rCount)
{
if (root == null){
return 0;
}
else {
int lheight = height(root.left, lCount + 1, rCount);
int rheight = height(root.right, lCount, rCount + 1);
if (lheight > rheight){
return(lheight);
}
else return(rheight);
}
}
使用 height(root,0,0)初始化方法调用,执行的L和R“分支”的最后一次执行将分别生成总计。
答案 1 :(得分:1)
做这样的事情 -
int height(Node root)
{
if (root == null)
return 0;
else
{
return 1+ Math.max(height(root.left),height(root.right));
}
}
像这样计算身高调用
int height = height(root); //this is the height not inside the function
我还没有编译它 - 但这是获得树高的方法(c / c ++ / java /..)
答案 2 :(得分:0)
树的高度是左子树高度和右子树高度的最大值。所以,如果你看到你的代码,那么它递归地计算左右子树的高度并检查哪个是最大值。如果你真的想要想象它。制作被调用方法的树结构。您可以轻松地将其可视化。
答案 3 :(得分:0)
以此为例
1
/ \
2 3
/ \
4 5
首先,1将通过其左侧[height(root.left)],因此将调用2。然后2将通过其左侧,因此将调用4。现在将调用它4。
因为4没有任何剩余它会传递null或0传递给 lheight 。所以这次代码转到下一步,即函数[height(root.right)]。
对于4的右边,我们有null,所以0将返回到rheight。现在借助 [返回(rheight + 1); ]函数,值1将被传递给调用函数2。
所以2将有lheight为1.Now 2现在将调用它的right.And循环继续,2将有两个值l = 1和r = 1并将返回1 + 1 = 2到它的调用函数即1。
调用1的权限,它将返回1,具有与之前相同的循环。最后,我们有l = 2和r = 1。因此,我们的最终值将是[lheight + 1] = 3。所以树的高度是3
答案 4 :(得分:-1)
你可以创建一个全局变量,每次该函数调用自己时都会增加该变量
int i; //it has to be initialized with 0
int height(Node root)
{
if (root == null)
return 0;
else
{
i++;
int lheight = height(root.left);
printf("%d ", lheight);
i++;
int rheight = height(root.right);
if (lheight > rheight)
return(lheight);
else return(rheight);
}
}