我们从二叉树的根节点 root
开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D
条短划线(其中 D
是该节点的深度),然后输出该节点的值。(如果节点的深度为 D
,则其直接子节点的深度为 D + 1
。根节点的深度为 0
)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S
,还原树并返回其根节点 root
。
示例 1:
输入:"1-2--3--4-5--6--7" 输出:[1,2,5,3,4,6,7]
示例 2:
输入:"1-2--3---4-5--6---7" 输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88" 输出:[1,401,null,349,88,90]
提示:
- 原始树中的节点数介于
1
和1000
之间。 - 每个节点的值介于
1
和10 ^ 9
之间。
Related Topics
栈辅助基本思路实现【联动 剑指 Offer 37. 序列化二叉树】
可以配合剑指 Offer 37. 序列化二叉树 一起做了加深理解,把这题的解法,加上自行再实现个序列化的方法就可以拿去做这一题了
借助辅助栈的基本思路,比较好理解,不过性能上略差
- 按照
-
分割字符串 - 第一个字符就是根节点
- 后面的节点的层属由这个字符串的前面有多少个分割出来的空字符串决定
- 由于是用
-
分割了,原来的两个相邻层级之间不存在空字符串分割了,所以下面代码中int level = 1;
从1开始,而不是从0
class Solution {
String[] strArr;
public TreeNode recoverFromPreorder(String traversal) {
if (null == traversal || traversal.length() ==0){
return null;
}
//拆出来。
strArr = traversal.split("-");
//第一个数字是根节点
TreeNode root = new TreeNode(Integer.parseInt(strArr[0]));
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.add(root);
int idx = 0;
while (++idx< strArr.length){
int level = 1;
//判断下一个数字的深度
while (strArr[idx].length()==0){
idx++;
level++;
}
//从栈顶弹出多余的
while (stack.size() > level){
stack.pollLast();
}
//构建节点
TreeNode node = new TreeNode(Integer.parseInt(strArr[idx]));
//由于序列化的时候是先序遍历,先尝试塞到左节点,如果左节点已经存在,则塞到右节点
if (stack.peekLast().left == null){
stack.peekLast().left = node;
}else{
stack.peekLast().right = node;
}
//当前节点处理完毕,将当前节点压入栈
stack.addLast(node);
}
return root;
}
}
发表评论