力扣-树-根据二叉树创建字符串
根据二叉树创建字符串(LeetCode 606)
-
题目概述:
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。 -
题目案例:
-
解题思路:围绕前序遍历展开,主要的讨论在左右结点是否为空,因为左节点为空时要保留括号,右节点为空时省略括号分为四种情况讨论
(1)左右结点均为空(2)左节点为空,右节点不为空(3)左节点不为空,右节点为空(4)左右结点均不为空
下面的解法分为递归和迭代两种解法,由于以前没有总结过树的递归(迭代)遍历,所以下一篇文章会总结一下,方便于本题的迭代解法 -
递归java代码
class Solution {
public String tree2str(TreeNode root) {
if(root==null)
return "";
if(root.left==null&&root.right==null){
//为了能够转为String类型,所以加“”
return root.val+"";
}
//如果右为空则括号可以省略
if(root.right==null)
return root.val+"("+tree2str(root.left)+")";
//如果左为空则要保留括号
return root.val+"("+tree2str(root.left)+")("+tree2str(root.right)+")";
}
}
- 迭代java代码
class Solution1 {
public String tree2str(TreeNode t) {
if (t == null)
return "";
Stack < TreeNode > stack = new Stack< >();
stack.push(t);
//创建已经遍历过的结点集合
Set< TreeNode > visited = new HashSet< >();
//创建拼接字符串
StringBuilder s = new StringBuilder();
while (!stack.isEmpty()) {
//查看栈顶内容,注意不要用pop(),否则之后无法添加")"
t = stack.peek();
//visited中有该节点,说明该结点的左右均已遍历完成,可以加")"
if (visited.contains(t)) {
stack.pop();
s.append(")");
} else {
visited.add(t);
s.append("(" + t.val);
if (t.left == null && t.right != null)
s.append("()");
//这里注意if的顺序,因为是前序遍历,所以先压右结点,再压左节点
if (t.right != null)
stack.push(t.right);
if (t.left != null)
stack.push(t.left);
}
}
//最开始会在最前面多家一个"(",需要去掉
return s.substring(1, s.length() - 1);
}
}