堆栈帧在二叉树遍历

时间:2014-03-29 01:20:32

标签: algorithm recursion tree binary-tree

我很难理解二叉树遍历的堆栈帧图片

我有这个函数来计算从根节点

开始的二叉树的高度
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

3 个答案:

答案 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.leftnull,再次打印-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)使用heightA.left进行第二次递归调用(null

4)第一个if语句触发,返回-1 - 返回到第3点的调用之后)

5)首先打印声明 - &#34;左-1和#34;。使用heightA.right)对null进行第三次递归调用

6) if再次触发,返回-1 - 返回到第5点的电话后)

7)第二个打印声明 - &#34;右-1和#34;。

8) left-1right-1,因此会返回right + 10 ) - 回到第2点的电话之后

9)第三个打印声明 - &#34;左0&#34;。

10)下一次heightB节点的递归调用。重复步骤2-8,将B替换为A。重复这个会产生两个打印语句&#34;左-1和#34;和&#34;对-1&#34;。

11)返回后,right0,因此最后一个打印语句为&#34;右0&#34;。

12) left0right0,因此会返回right + 1