转换原始二叉树以使其作为预订单索引进行装饰

时间:2013-03-18 20:41:14

标签: java recursion tree traversal

我已经去了,它适用于左子树但不适合。

我很接近,但我的逻辑错了,任何人都可以帮助纠正并解释这个逻辑。

public static MyNode preOrderNumbering(MyNode n) {
            if (n != null) {
                n.obj = 0; // Set root decoration to 0;
                preOrderHelper(n, 1); // Set decorations according to preorder.
            }
            return n;
        }

        public static MyNode preOrderHelper(MyNode n, int counter) {
            if (n != null) {
                if (n.left != null) {
                    n.left.obj = counter++; // Set the left object decoration to current count + 1;
                    preOrderHelper(n.left, counter);
                }
                if (n.right != null) {
                    n.right.obj = counter++; // Set the left object decoration to current count + 1;
                    preOrderHelper(n.right, counter);
                }
            }
            return n;
        }

之前:http://puu.sh/2k2H7.png

在: enter image description here

2 个答案:

答案 0 :(得分:3)

在转到counter之前,您需要使用left上发现的所有内容更新right

这样的事情:

public static int preOrderNumbering(MyNode n, int count){
    if(n != null){
        n.obj = ++count;

        count = preOrderNumbering(n.left, count);
        count = preOrderNumbering(n.right, count);

    }
    return count;
}

答案 1 :(得分:0)

你通过值传递counter,而不是通过引用传递(因为这就是Java的工作方式),所以当递归展开时,计数器也是如此。

您可以通过从递归调用中返回当前值来更新计数器。