Leetcode 1028 從先序遍歷還原二叉樹

2021-10-07 07:25:10 字數 1711 閱讀 1317

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,還原樹並返...