打印()预订中的子树

时间:2013-10-13 15:10:46

标签: java algorithm

我需要打印(和)预订的子树:

       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()))

1 个答案:

答案 0 :(得分:1)

我发现这两行可疑:

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;
}