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

我发现这两行可疑:

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 回答