1

私は試してみましたが、左のサブツリーでは機能しますが、右のサブツリーでは機能しません。

私は近くにいますが、私の論理は間違っています。これに対する論理を修正して説明するのを手伝ってくれる人はいますか?

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

後: ここに画像の説明を入力

4

2 に答える 2

3

に移動する前にcounter、 で検出されたすべてのものでを更新する必要があります。leftright

このようなもの:

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;
}
于 2013-03-18T21:12:02.390 に答える
0

参照ではなく値で渡しcounterているため (これが Java の仕組みであるため)、再帰が巻き戻されると、カウンターも巻き戻されます。

再帰呼び出しから現在の値を返すことで、カウンターを更新できます。

于 2013-03-18T21:05:42.867 に答える