1,題目:
我們從二叉樹的根節點 root 開始進行深度優先搜尋。
在遍歷中的每個節點處,我們輸出 d 條短劃線(其中 d 是該節點的深度),然後輸出該節點的值。(如果節點的深度為 d,則其直接子節點的深度為 d + 1。根節點的深度為 0)。
如果節點只有乙個子節點,那麼保證該子節點為左子節點。
給出遍歷輸出 s,還原樹並返回其根節點 root。
2,演算法說明:
1) 切割字串,通過判斷'-'的個數來算出第幾層;通過strconv.atoi來轉換字串到數字
2) 遞迴左右兩邊二叉樹
3) 直接看**,**每一步都解釋了,先看getdepth()函式,再看m()函式,
最後看recoverfrompreorder()函式
4) 覺得有啟發的話,希望給個贊
3,*** definition for a binary tree node.
*type treenode struct*/
//主體函式
func
recoverfrompreorder
(s string
)*treenode
//呼叫迭代的函式,迭代**好,二叉樹的問題用迭代能解決一大半
//預設父親層數是-1
_, node :=
m(s ,-1
)return node
}//迭代函式,需要傳入字串,父親層數
func
m(s string
, parent_depth int)(
string
,*treenode)
//通過擷取字串來解析當前是第幾層,數值,剩餘的字串
d , n , st :=
getdepth
(s)//如果層數小於 && 等於 父親層數,說明不要繼續迭代了,需要返回
//這一步我認為是核心判斷條件,關鍵靠這一步才能還原正確
if d <= parent_depth
//根據數值new出乙個二叉樹
node :=
&treenode
//遞迴,得到二叉樹左邊,以及剩餘的字串
st , node.left =
m(st , d)
//遞迴,得到二叉樹右邊,以及剩餘的字串
st , node.right =
m(st , d)
return st , node
}//通過擷取字串來解析當前是第幾層,數值,剩餘的字串
func
getdepth
(s string)(
int,
int,
string
)else
}//轉換字串到數字,預設是擷取到字串最後一位,
//這樣是為了避免傳進來的字串就沒有包含'-'
endidx :=
len(s)
for i := depth ; i <
len(s)
; i++
}//基本不用考慮是否會轉換出錯
str ,
_:= strconv.
atoi
(s[depth:endidx]
)//返回 第幾層,數值,剩餘的字串
return depth , str , s[endidx:
len(s)
]}
LeetCode 1028 從先序遍歷還原二叉樹
我們從二叉樹的根節點 root 開始進行深度優先搜尋。在遍歷中的每個節點處,我們輸出 d 條短劃線 其中 d 是該節點的深度 然後輸出該節點的值。如果節點的深度為 d,則其直接子節點的深度為 d 1。根節點的深度為 0 如果節點只有乙個子節點,那麼保證該子節點為左子節點。給出遍歷輸出 s,還原樹並返...
leetcode 1028 從先序遍歷還原二叉樹
public treenode recoverfrompreorder string s 再確定結點的值 先將值初始化為0 int value 0 while icharacter.isdigit s i 構造樹的結點 treenode node new treenode value 插入到正確位置...
1028 從先序遍歷還原二叉樹。 深搜
我們從二叉樹的根節點 root 開始進行深度優先搜尋。在遍歷中的每個節點處,我們輸出 d 條短劃線 其中 d 是該節點的深度 然後輸出該節點的值。如果節點的深度為 d,則其直接子節點的深度為 d 1。根節點的深度為 0 如果節點只有乙個子節點,那麼保證該子節點為左子節點。給出遍歷輸出 s,還原樹並返...