leetcode1028. 从先序遍历还原二叉树(dfs/栈)

142 阅读1分钟

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