Verify Preorder Serialization of a Binary Tree(搭配流處理分隔字符串)

One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as #.

     _9_
    /   \
   3     2
  / \   / \
 4   1  #  6
/ \ / \   / \
# # # #   # #

For example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node.

Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.

Each comma separated value in the string must be either an integer or a character '#' representing null pointer.

You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3".

Example 1:

Input: "9,3,4,#,#,1,#,#,2,#,6,#,#"
Output: true

Example 2:

Input: "1,#"
Output: false

Example 3:

Input: "9,#,#,1"
Output: false
/* 驗證字符串是否爲二叉樹前序序列化之後的結果
 * # 數量=n1 + 2*n0  = n1 + n0 + n2 + 1 = N+1 即比總節點數多1 且最後一個必定爲#
 * 從序列起始到中間任意一個位置 如果# 數量多於數字數量返回false
 * */
class Solution {
public:
    bool isValidSerialization(string preorder) {
        string tmp;
        stringstream ss(preorder);
        int cnt=0;
        bool iszero=false;
        // cnt<0不能直接返回false 在讀取最後一個#時 cnt=-1 但是已經爲空 所以
        while(getline(ss, tmp, ',')){
            if(iszero)  return false;
            if(tmp=="#")    cnt--;
            else cnt++;
            if(cnt<0)   iszero=true;
        }
        return cnt==-1 && tmp=="#";
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章