我已经去了,它适用于左子树但不适合。
我很接近,但我的逻辑错了,任何人都可以帮助纠正并解释这个逻辑。
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;
}
之前:
在:
答案 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的工作方式),所以当递归展开时,计数器也是如此。
您可以通过从递归调用中返回当前值来更新计数器。