序列化二叉樹的一種方法是使用前序遍歷。當我們遇到一個非空節點時,我們可以記錄下這個節點的值。如果它是一個空節點,我們可以使用一個標記值記錄,例如 #。_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
解題思路
因為這題連空節點都連出來了,所以只需要統計空節點和正常節點是否能滿足前序遍歷的要求。一個正常節點必須連接兩個子節點(包括#節點),而空節點不能擁有子節點,因此存在關系 父節點(除#以外)后面必須有兩個元素(包括正常節點和#節點,#節點后面不能接子節點
代碼
class Solution {public boolean isValidSerialization(String preorder) {String[] split = preorder.split(",");int i=0,n=split.length,slot=1;while (i<n){if(slot==0) return false;//后面還有節點沒遍歷完,坑位已經被占慢了if(split[i++].equals("#"))slot--;//空節點,坑位被占掉一個,由于沒有子節點,不需要添加坑位else slot++;
//坑位被占掉一個,但是因為有兩個子節點,需要多加兩個坑位,所以實際上只加了一個}return slot==0;}
}