【树】A035_LC_从先序遍历还原二叉树(栈迭代 / 递归)

一、Problem

我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。

给出遍历输出 S,还原树并返回其根节点 root。
在这里插入图片描述

输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]

提示:

原始树中的节点数介于 1 和 1000 之间。
每个节点的值介于 1 和 1 0 9 10 ^ 9 之间。

二、Solution

方法一:栈模拟

  • 因为先序遍历是先一直从左路走到头的,所以 - 的数量以某个点为根节点的走了 dep 层(dep 个结点)。
  • stack 的大小一定代表着当前遍历到的层数,所以要找当前结点的父亲时,就要从 stack 中找到第 dep 个结点。
class Solution {
    public TreeNode recoverFromPreorder(String S) {
         char[] s = S.toCharArray();
         Stack<TreeNode> st = new Stack<>();
         int n = s.length;

         for (int i = 0; i < n;) {
            int dep = 0;
            while (s[i] == '-') {
                dep++;
                i++;
            }
            int v = 0;
            while (i < n && s[i] != '-') {
                v = v * 10 + s[i++]-'0';
            }
            while (st.size() > dep)
                st.pop();
            TreeNode child = new TreeNode(v);
            if (!st.isEmpty()) {
                if (st.peek().left == null) st.peek().left  = child;
                else                        st.peek().right = child;
            }
            st.push(child);
         }
         while (st.size() > 1)
            st.pop();
         return st.peek();
    }
}

复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()

方法二:


复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/106845039