题目:给你二叉树的根节点
root
,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对
"()"
表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
示例 2:
提示:
- 树中节点的数目范围是
[1, 104]
-1000 <= Node.val <= 1000
前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树
心态备注:读题目的第一遍,除了前序遍历知道外,啥也没懂,跟没读一样,无语,再看输入输出,(⇀‸↼‶)这在干啥啊!
切入正题,谈谈对题目的理解
对示例1的理解如下图
前序遍历这棵树出现的需要注意的情况时:
1.左边为空,右边也为空,字符串stringBuilder拼接 ')'
2.左边不为空,右边为空,字符串stringBuilder拼接 ')'
对示例2的理解如下图
前序遍历这棵树出现的需要注意的情况时:
左边为空,右边不为空时,字符串stringBuilder拼接 '()'
代码
public class Solution {
public String tree2str(TreeNode root) {
if (root == null) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
tree2strChild(root, stringBuilder);
return stringBuilder.toString();
}
public void tree2strChild(TreeNode root, StringBuilder stringBuilder) {
if (root == null) {
return;
}
stringBuilder.append(root.val);//不为null时,拼接该节点的存储数据
//递归左树
if (root.left != null) {
stringBuilder.append("(");//左边不为空(null),凭接"("
tree2strChild(root.left, stringBuilder);//再以前序遍历的方式递归左树
stringBuilder.append(")");//左树递归完了,开始回退,凭接")"
} else {
//左边为空的情况,对右边进行判断
//1.右边不为空
//2.右边为空
//开始讨论
if (root.right != null) {//左边为空,右边不为空,拼接"()"
stringBuilder.append("()");
} else {//左边为空,右边为空,什么也不做,递归开始返回
return;
}
}
//递归右树
if(root.right==null){
return;//什么也不做,递归开始回退
}else {
stringBuilder.append("(");//右边不为空(null),凭接"("
tree2strChild(root.right,stringBuilder);//再以前序遍历的方式递归右树
stringBuilder.append(")");//右树递归完了,开始回退,凭接")"
}
}
}
运行结果
注:该题递归思想有点难以理解,多想想,或者多刷点题
题目链接:
https://leetcode.cn/problems/construct-string-from-binary-tree/submissions/457036963/
完结撒花