人千萬不能有惰性,兩天沒寫題解,就不是很想補之前的題解了,但是今天必須糾正這個事情,要開始補題解了。
序列化二叉樹的一種方法是使用前序遍歷。當我們遇到乙個非空節點時,我們可以記錄下這個節點的值。如果它是乙個空節點,我們可以使用乙個標記值記錄,例如 #。
_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 需要注意的是,左 右子樹 是指...