我想按照它们存储的顺序返回一个包含树中所有键的String。每个子树中的键应包含在括号中。
_7_
/ \
_3_ 8
/ \
1 6
\ /
2 4
\
5
此BST的输出应为(((()1(()2()))3((()4(()5()))6()))7(()8()))
。
我这样做的代码是:
public String printKeysInOrder() {
if (isEmpty()) {
return "()";
}
printInOrderRec(root);
System.out.print(sb.toString());
return sb.toString();
}
StringBuilder sb = new StringBuilder();
private String printInOrderRec(Node root) {
if (root == null) {
return null;
}
sb.append("(");
printInOrderRec(root.left);
sb.append("(");
sb.append(")");
sb.append(root.val);
printInOrderRec(root.right);
return null;
}
这给了我输出:(((()1(()2()3((()4(()5()6()7(()8
。
我一直在研究这个问题多年,无法弄清楚在哪里以及如何追加缺失的括号。任何帮助,将不胜感激。
答案 0 :(得分:0)
在进入编码解决方案之前,让我们尝试绘制如何生成输出。
(--------------------------------7-------)
(------------3-----------------) (--8--)
(--1-------) (------------6--) () ()
() (--2--) (--4-------) ()
() () () (--5--)
() ()
这里每个括起来的括号都定义了一个call stack。我不是要描述每个调用堆栈,否则这个答案将是非常长的。但是,从图中我们可以在每个调用堆栈中找到5个部分。
因此,您的printInOrderRec
方法可能如下所示:
private void printInOrderRec(Node root) {
sb.append("(");
if (root != null) {
printInOrderRec(root.left);
sb.append(root.val);
printInOrderRec(root.right);
}
sb.append(")");
}
注意:我已经返回类型void
,因为在您的代码中它只返回null。