我们从二叉树的根节点 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();}
}