你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-string-from-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目的意思是子节点需要用()
来包裹。举例来说,二叉树[root,left,right]
,则转换为root(left)(right)
。如果只有left
为空节点,则输出root()(right)
;如果只有right
为空节点则可以忽略右节点的()
,输出为root(left)
。
生成字符串的规则其实就是在「前序遍历」输出节点值的同时,在每颗子树的左右添加一对 ()(根节点除外),同时需要忽略掉一些不必要的 () 。
所谓的不必要就是指当以某个节点 xx 为根时,其只「有左子树」而「没有右子树」时,右子树的 () 可被忽略,或者「左右子树都没有」时,两者的 () 可被忽略。
或者反过来说,如果对于每个非空节点才添加 () 的话,那么当「有右子树」同时「没有左子树」时,左子树的 () 不能被忽略,需要额外添加,从而确保生成出来的字符串能够与「有左子树」同时「没有右子树」的情况区分开来,而不会产生二义性。
class Solution {
StringBuilder sb = new StringBuilder();
public String tree2str(TreeNode root) {
dfs(root);
return sb.substring(1, sb.length() - 1);
}
void dfs(TreeNode root) {
sb.append("(");
sb.append(root.val);
if (root.left != null) dfs(root.left);
else if (root.right != null) sb.append("()");
if (root.right != null) dfs(root.right);
sb.append(")");
}
}