我很难理解二叉树遍历的堆栈帧图片
我有这个函数来计算从根节点
开始的二叉树的高度public static int height(TreeNode<String> t){
if(t == null)
return -1;
int left = height(t.left);
System.out.println("left " +left);
int right = height(t.right);
System.out.println("right " +right);
if(left > right)
return left + 1;
else
return right + 1;
}
我有一个二叉树设置如下
Root
/ \
A B
返回的高度值是1,这是正确的,但我很难理解两个递归函数的堆栈帧流。什么是流量顺序?
我在两个打印陈述中得到以下值:
left -1
right -1
left 0
left -1
right -1
right 0
答案 0 :(得分:1)
height
的执行按顺序遵循树形状。
height
首先在Root
上调用,然后在第4行的Root.left
上递归调用,然后在Root.left.left
上递归递归,即null
。此时,height
的最后一次执行返回-1
并终止。剩下的最后一次执行将其分配给left
并打印出来。
同样的执行nex在height
上调用Root.left.right
。这也是null
,因此返回并打印-1
,之后if语句计算-1 + 1 == 0
并返回此值。
我们现在回到Root.left
上的调用,返回的值0
被分配给left
并打印出来,然后相同的执行再次调用height
并且再次点击Root.right.left
,null
,再次打印-1
。
此时你应该看到模式。
答案 1 :(得分:0)
left -1 A.left is null
right -1 A.right is null
left 0 Root.left is A
left -1 B.left is null
right -1 B.right is null
right 0 Root.right is B
但如果你想要一个更清晰的画面,你应该编写类似
的代码public static int height(TreeNode<String> t){
if(t == null)
return -1;
int left = height(t.left);
System.out.println(t+" left "+left);
int right = height(t.right);
System.out.println(t+" right "+right);
if(left > right)
return left + 1;
else
return right + 1;
}
答案 2 :(得分:0)
不确定你的问题究竟是什么,但现在就是这样:
1)使用根节点
初次调用height
2)首次使用height
节点递归调用A
3)使用height
对A.left
进行第二次递归调用(null
)
4)第一个if
语句触发,返回-1
- 返回到第3点的调用之后)
5)首先打印声明 - &#34;左-1和#34;。使用height
(A.right
)对null
进行第三次递归调用
6) if
再次触发,返回-1
- 返回到第5点的电话后)
7)第二个打印声明 - &#34;右-1和#34;。
8) left
为-1
,right
为-1
,因此会返回right + 1
(0
) - 回到第2点的电话之后
9)第三个打印声明 - &#34;左0&#34;。
10)下一次height
与B
节点的递归调用。重复步骤2-8,将B
替换为A
。重复这个会产生两个打印语句&#34;左-1和#34;和&#34;对-1&#34;。
11)返回后,right
为0
,因此最后一个打印语句为&#34;右0&#34;。
12) left
为0
,right
为0
,因此会返回right + 1