Leetcode 331.验证二叉树的前序序列化

331.验证二叉树的前序序列化

题目

序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     _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个空位置
  • 非空结点,需要占用1个空位置,并生成2个空位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution(object):
def isValidSerialization(self, preorder):
"""
:type preorder: str
:rtype: bool
res:记录当前空位置
- 非空结点会占据一个位置,但会生成两个空位置
- 空结点会占据一个位置
"""

# 初始化有一个空位置,用于放置根结点
res=1
for v in preorder.split(','):
# 如果没有空位置防止当前结点,返回False
if res==0:
return False
# 情况2:空结点,占据一个空位置
if v=='#':
res-=1
# 情况3:非空结点,会生成一个新的空位置
else:
res+=1
return res==0