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

2021-10-22 00:08:43 字數 2249 閱讀 9306

人千萬不能有惰性,兩天沒寫題解,就不是很想補之前的題解了,但是今天必須糾正這個事情,要開始補題解了。

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

_9_/ \

3 2

/ \ / \

4 1 # 6

/ \ / \ / \

# # # # # #

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

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

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

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

輸入: "9,3,4,#,#,1,#,#,2,#,6,#,#"

輸出: true

二叉樹的特點是每個節點的子樹不大於二,在本題中,假如乙個節點只有乙個子樹,那麼另乙個子樹為 『#』 。在有向圖中,頂點的入度,表示有多少條邊指向這個頂點;頂點的出度,表示有多少條邊是以這個頂點為起點指向其他頂點。那麼在二叉樹中,所有節點的入度之和等於出度之和

在二叉樹中,"#"對應著乙個入度,非空節點對應著乙個入度,兩個出度。根據出現的字元進行相應度的計算操作即可。

具體**如下所示:

class

solution

else

if(preorder[i]

<=

'9'&& preorder[i]

>=

'0')

cnt++;}

}if(cnt ==0)

return

true

;return

false;}

};

其實我在一開始的時候就想的是用棧解決,但是其中有乙個bug一直找不到,使用度的定**決了這個問題。但是做完後,總是心有不甘,於是重新檢查了一遍,終於發現了問題。問題將會在後面給出。

用棧的思想其實也比較簡單,因為在給出的資料中,"#"也給出了,導致葉子節點的格式如下:

_9_

/ \

# #

那麼我們其實可以用遞迴消除的思想,將乙個類似的節點用 「#」 代替。對於一棵二叉樹,每乙個葉子節點都被 「#」 代替後,其上層節點也就變成了新的葉子節點。最後我們只需要判斷最後的棧中是不是只有乙個 「#」 即可。

過程類似於:

[9,3,4,#,#] => [9,3,#],繼續

[9,3,#,1,#,#] => [9,3,#,#] => [9,#] ,繼續

[9,#2,#,6,#,#] => [9,#,2,#,#] => [9,#,#] => [#],結束

思想較為簡單,但是需要注意兩點:

1.乙個是每次將葉子節點轉為 "#" 的時候,可能每次不會只遞迴一次。例如對於」1,#,1,#,#「 ,假如只轉換一次,就會在棧中留下 」1,#,#「 的資料,使得原本正確的二叉樹由於不正確的解答而答案錯誤。

2.第二個就是在轉換的時候必須確保是類似 」x, #, #「 的字串,其中 x 必須是非 "#" 的字元,這也是我出錯的地方。

具體**如下所示:

class

solution

else

if(preorder[i]

<=

'9'&& preorder[i]

>=

'0')

st.push

(sum);}

else}if

(st.

empty()

||(st.

size()

==1&& st.

top()==

'#')

)return

true

;return

false;}

void

inserttostack()

st.pop();

if(!st.

empty()

&& st.

top()!=

'#')

else}}

;

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

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

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

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

leetcode 驗證二叉搜尋樹

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