0

予約注文のサブツリーの ( および ) を出力する必要があります。

       A
     /   \
    B     G
   / \
  C   P
   \
    E

私はやろうとしました:

public StringBuilder preOrder(StringBuilder string) {
        string.append(value);
        if (left!=null || right!=null)
            string.append("(");
        if (left != null){
            left.preOrder(string);
        }
        if (left!=null && right!=null)
            string.append(")");
        if (right != null){
            right.preOrder(string);
        }
        return string;
    }

ただし、結果は次のようになります。

A(B(C(E)P)G

それ以外の:

(A(B(C(E)P)G))

なにが問題ですか?

編集:

そうでなければならない

(A(B(C(E())P())G()))

4

1 に答える 1

1

次の 2 行が疑わしいと思います。

if (left!=null && right!=null)
    string.append(")");
if (right != null){
    right.preOrder(string);
}

右ブラケットを挿入してから、右の子を処理しています右の子の後の右の括弧はどこですか?

私はこれがうまくいくと思います:

if (right != null){
    right.preOrder(string);
}
if (left != null || right != null)
    string.append(")");

そして、周囲の括弧を(個別に)説明する必要があります(上記はあなたに与えるはずです、呼び出し関数A(B(C(E)P)G)に周囲を追加する必要があります)。()

あなたの編集に応じて:

子を持つかどうかに関係なく括弧を追加したいので、どちらの場合も
削除してください:if (left != null || right != null)

public StringBuilder preOrder(StringBuilder string) {
    string.append(value);
    string.append("(");
    if (left != null){
        left.preOrder(string);
    }
    if (right != null){
        right.preOrder(string);
    }
    string.append(")");
    return string;
}
于 2013-10-13T15:24:00.627 に答える