1. 程式人生 > >[Leetcode] 第331題 驗證二叉樹的前序序列化

[Leetcode] 第331題 驗證二叉樹的前序序列化

一、題目描述

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

     _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 };