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

2021-10-21 20:20:07 字數 2029 閱讀 4029

目錄

一、題目內容

二、解題思路

三、**

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

_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

用棧儲存數字,『#』作為出棧的依據;

事先棧中存入乙個『#』;

當棧中最後乙個是『#』且preorder序列最後也是『#』,則說明是正確的二叉樹的前序序列化;

否則若preorder中『#』還沒有到最後位置就與棧中的『#』匹配,則說明是不正確的。

class solution:

def isvalidserialization(self, preorder: str) -> bool:

stack = ['#']

i = 0

while i < len(preorder):

if preorder[i] == ',':

i += 1

continue

elif preorder[i] == '#':

if stack[-1] == '#':

if i == len(preorder) - 1:

stack.pop()

else:

return false

else:

stack.pop()

elif preorder[i] != '#':

while i < len(preorder) and preorder[i] != ',':

i += 1

i += 1

return len(stack) == 0

if __name__ == '__main__':

s = solution()

preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"

ans = s.isvalidserialization(preorder)

print(ans)

leetcode 331驗證二叉樹前序序列化(棧)

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

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

人千萬不能有惰性,兩天沒寫題解,就不是很想補之前的題解了,但是今天必須糾正這個事情,要開始補題解了。序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 9 3 2 4 1 6 例如,上面的二叉樹可以被序列化...

leetcode 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3輸出 true 示例 2 輸入 5 1 4 3 6輸出 false解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 需要注意的是,左 右子樹 是指...