[Leetcode] 第331題 驗證二叉樹的前序序列化
阿新 • • 發佈:2019-01-04
一、題目描述
序列化二叉樹的一種方法是使用前序遍歷。當我們遇到一個非空節點時,我們可以記錄下這個節點的值。如果它是一個空節點,我們可以使用一個標記值記錄,例如 #
。
_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
二、題目解析
1)有規律:#比數字的個數多一個,而且結尾必須是#
2)除去最後一個,在0到i的任意範圍內,數字的個數都不少於#的個數
3)用cnt來計數,遇到數字+1,遇到# -1,檢驗從0到n-1範圍內的符號,最終應該是0
三、程式碼實現
1 class Solution { 2 public: 3 bool isValidSerialization(string preorder) { 4 if (preorder.size() == 0)return false; 5 istringstream is(preorder); 6 string str = ""; 7 vector<string>v; 8 while (getline(is, str, ','))v.push_back(str);9 int cnt = 0; 10 for (int i = 0; i < v.size() - 1; ++i) { 11 if (v[i] == "#") { 12 if (!cnt)return false; 13 --cnt; 14 } 15 else ++cnt; 16 } 17 return cnt == 0 && v.back() == "#"; 18 } 19 };