[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 };
原文地址:https://www.cnblogs.com/zhizhiyu/p/10219363.html