【樹】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 和 10910 ^ 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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章