问题:
给你二叉树的根节点 root
,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对 "()"
表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入:root = [1,2,3,4] 输出:"1(2(4))(3)" 解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
示例 2:
输入:root = [1,2,3,null,4] 输出:"1(2()(4))(3)" 解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
题解:
通过题干和给的示例我们可以得到,该题是要我们用前序遍历的方式遍历二叉树,并且将二叉树转化为由括号和整数组成的字符串,并且说空节点返回一对空括号,再来看给我们的两个示例
根据示例一:
输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
根节点后面跟上两个括号里面是它的左右子树,当根节点有左子树没有右子树的情况下,右子树的括号不用写,直接省略,当根节点的左右子树都为空的时候,两个括号都去掉。
再根据示例二可以得到:
输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
当根节点没有左子树但是有右子树的情况下,用来表示左子树的括号就不能省略,要不然就无法分清每个节点的左右子树;
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public String tree2str(TreeNode root) {
StringBuilder sb = new StringBuilder();
tree2strChild(root,sb);
return sb.toString();
}
public void tree2strChild(TreeNode n,StringBuilder sb){
if(n == null){
return ;
}
sb.append(n.val);
if(n.left != null){
sb.append("(");
tree2strChild(n.left,sb);
sb.append(")");
}else{
if(n.right == null){
return ;
}else {
sb.append("()");
}
}
if(n.right == null){
return ;
}else {
sb.append("(");
tree2strChild(n.right,sb);
sb.append(")");
}
}
}