我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
输入:“1-2–3--4-5–6--7”
输出:[1,2,5,3,4,6,7]
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode recoverFromPreorder(String S) {
LinkedList<TreeNode> stack=new LinkedList<>();
int pos=0;
while (pos<S.length())//逐个遍历
{
int level=0;
while (S.charAt(pos)=='-')//获取当前数字所在层数
{
pos++;
level++;
}
int val=0;
while (pos<S.length()&&Character.isDigit(S.charAt(pos)))//提取字符串的数字
{
val=val*10+(S.charAt(pos)-'0');
pos++;
}
TreeNode temp=new TreeNode(val);
if(stack.size()==level)//栈中元素等于层数,根据先序遍历的特点说明当前是在左子树
{
if(!stack.isEmpty())
stack.getLast().left=temp;
}else {//栈中元素不等于层数,根据先序遍历的特点说明当前是在又子树,需要先将左子树出栈,才能获得父节点
while (stack.size()>level)
stack.removeLast();
stack.getLast().right=temp;
}
stack.add(temp);
}
while (stack.size()>1)
stack.removeLast();
return stack.getLast();
}
}