一、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 和 之間。
二、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();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,
方法二:
複雜度分析
- 時間複雜度:,
- 空間複雜度:,