给出一个二叉树,用前序遍历的方式搭建字符串。
节点值被括号包围,在不破坏树的重建的情况下可省略空括号。
什么叫不破坏树的重建?
比如Example 1, 2没有右子树,(2(4))不影响重建,因为有整个的括号把这个子树包围,能看出来它没有右子树。
但是Example 2中,2没有左子树,这时()就不能省略,如果省略,成了(2(4)),那4到底是左子树还是右子树呢。
思路:
前序遍历本身还是比较容易想到的
root.val
preOrder(root.left);
preOrder(root.right);
问题在于加括号这一步,很绕。
首先root本身是不加括号的,就需要先放root.val,
括号就要在左子树和右子树处加。
于是前序遍历成了这种形式
res += root.val
res += "("
preOrder(root.left);
res += ")"
res += "("
preOrder(root.right);
res += ")"
left为null, right不为null时,要加上左子树的"()"
StringBuilder要比String + 省内存,要快(因为不用新建object)。
class Solution {
StringBuilder res = new StringBuilder();
public String tree2str(TreeNode root) {
preOrder(root);
return res.toString();
}
void preOrder(TreeNode root) {
res.append(root.val);
if(root.left == null && root.right == null) return;
if(root.left != null) {
res.append("(");
preOrder(root.left);
res.append(")");
}
if(root.right != null) {
if(root.left == null) res.append("()");
res.append("(");
preOrder(root.right);
res.append(")");
}
}
}