我需要打印(和)预订的子树:
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()))
答案 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;
}