331 驗證二叉樹的前序序列化

2021-10-21 21:31:44 字數 1272 閱讀 3402

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 #。

9

/ \

3 2

/\ /\

4 1 # 6

/ \ /\ /\

# # # # # #

例如,上面的二叉樹可以被序列化為字串 「9,3,4,#,#,1,#,#,2,#,6,#,#」,其中 # 代表乙個空節點。

給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫乙個在不重構樹的條件下的可行演算法。

每個以逗號分隔的字元或為乙個整數或為乙個表示 null 指標的 『#』 。

你可以認為輸入格式總是有效的,例如它永遠不會包含兩個連續的逗號,比如 「1,3」 。

示例 1:

輸入: 「9,3,4,#,#,1,#,#,2,#,6,#,#」

輸出: true

示例 2:

輸入: 「1,#」

輸出: false

示例 3:

輸入: 「9,#,#,1」

輸出: false

從序列起始處開始遍歷,如果遇到數值就入棧,如果遇到"#「號,說明該位置已經到達了葉子節點,這時候需要檢視棧頂是否也為」#",如果是,說明棧頂的前一位置就是該葉子節點的父節點.因此我們將棧頂元素和棧頂的上一元素出棧,然後用"#「替代(入棧,表示某一分支已經結束),這樣操作後,最終根節點的左右孩子都會被替代為」#",合併後棧中只剩下乙個"#",表明所有節點都已經遍歷完。如果最後棧中大小不為1,說明該序列是錯誤的

class

solution

(object):

defisvalidserialization

(self, preorder)

: stack =

for node in preorder.split(

',')

:while

len(stack)

>=

3and stack[-1

]== stack[-2

]=='#'and stack[-3

]!='#':

stack.pop(

), stack.pop(

), stack.pop(

)'#'

)return

len(stack)==1

and stack.pop()==

'#'

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 9 3 2 4 1 6 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二...

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 9 3 2 4 1 6 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二...

331 驗證二叉樹的前序序列化

序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 例如,上面的二叉樹可以被序列化為字串 9,3,4,1,2,6,其中 代表乙個空節點。給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫乙...