题目描述:
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入: 二叉树: [1,2,3,4]
输出: “1(2(4))(3)”
解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,它将是“1(2(4))(3)”。
示例 2:
输入: 二叉树: [1,2,3,null,4]
输出: “1(2()(4))(3)”
解释: 和第一个示例相似,除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
//先来搞清楚几个点
// 1. 当 t 为空时,返回空字符串
// 2. 当 t 不为空时
// 1. 如果 t.left==null&&t.right==null,返回 “t”
// 2. 如果 t.left==null&&t.right!=null,除了返回应该返回的值外,此时左孩子为空,但是还要返回一个空括号,不能省略,否则给读者看来就是没有右孩子,是左孩子
// 3. 如果 t.left!+null&&t.right==null,此时右孩子为空,不需要返回空括号
// 4. 如果两个都不为空,则两边递归进行判断
class Solution {
public static String _tree2str(TreeNode t){
String str = "";
if(t!=null){
//我们是要用递归的方法做这道题
//如果按照根节点来说,要先把值放进去,再加括号
//但是对于以后的其他节点如果先放值u,再加括号,就会出现 4() 类似于这种情况,而根节点只有一个,最后可以对返回的字符串进行截取,不要第一个 (
str+="(";
str+=t.val;
if(t.left==null&&t.right==null){
}else if(t.left!=null&&t.right==null){
str+=_tree2str(t.left);
}else if(t.left==null&&t.right!=null){//左孩子为空,不能省略括号
str+="()";
str+=_tree2str(t.right);
}else{
str+=_tree2str(t.left);
str+=_tree2str(t.right);
}
str+=")";
}
return str;
}
public String tree2str(TreeNode t) {
if(t==null){
return "";
}
String s = _tree2str(t);
return s.substring(1,s.length()-1);//去除第一个(
}
}