前往
大廳
主題

LeetCode - 331. Verify Preorder Serialization of a Binary Tree 解題心得

Not In My Back Yard | 2022-02-04 00:00:06 | 巴幣 0 | 人氣 192

題目連結:


題目意譯:
將一棵二元樹序列化的方式其中之一是利用前序探訪。當我們遇到一個非空節點時,我們記錄該節點的值。如果是一個空節點,則我們使用一標記值例如 '#' 來記錄。
比方說,上述二元樹可以被序列化成字串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 '#' 代表著空節點。

給定一個以逗號分隔數值的字串 preorder,回傳真(True)如果其為某個二元樹的一個正確前序探訪之序列化。

保證字串中每個被逗號隔開的數值只會是一個整數或是一個字元 '#' 代表著空指標。

你可以假設輸入格式一定合法。

例如輸入絕對不會包含兩個連續的逗號,例如 "1,,3"。

注:你不被允許重建該二元樹。

限制:
1 ≦ preorder.length ≦ 10 ^ 4
preorder 由範圍 [0, 100] 的整數以及 '#' 組成,彼此之間用逗號隔開。



範例測資:
範例 1:
輸入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
輸出: true

範例 2:
輸入: preorder = "1,#"
輸出: false

範例 3:
輸入: preorder = "9,#,#,1"
輸出: false


解題思維:
利用一個變數 X 來儲存目前還有多少空位需要填補一個空節點(因為每個非空節點會有兩個子節點,子節點可能為空或不為空)。一開始假設我們有另一個虛構的節點來指向我們的二元樹,因此將 X 設為 1。

接著掃過 preorder 這個字串。每遇到一個逗號 ',' 時,判斷該逗號前的字元是不是 '#'。如果是,則代表我們把某個節點的子節點的位置用一個空節點佔掉了,因此 X 要減去 1;反之,某個節點的其中一個子節點是一個非空的節點,而該節點又會有兩個子節點,因此整體代表著 X 要加上 1。

結束後,判斷 preorder 最後的字元是不是 '#',然後做跟上面過程中一樣的動作以及判斷(因為最後一個字元代表的節點在過程中不被考慮到)。

最後判斷 X 是否為 0 即可。如果 X = 0,則代表所有節點都有若干個非空節點或是空節點作為其兩個子節點,因此 preorder 可以是某個二元樹的前序探訪序列化之結果,所以回傳真;反之,回傳假(False)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作