Problem: 331. 验证二叉树的前序序列化
思路
仔细阅读题目:二叉树的前序遍历
「开始皱眉」
定睛一看:原来是消消乐!
我们知道,树的叶子节点必然带着两个空指针#
,也就是说,数字 # #
就是一个叶子节点,那我们就可以把它变成#
,换言之去掉这个叶子节点。
也就是说游戏规则就变成了:重复扫描列表,出现数字 # #
的换成#
,一遍一遍把叶子节点去掉。最后必然是剩下一个#
,就返回True。
For Example:
[‘9’, ‘#’, ‘93’, ‘#’, ‘9’, ‘#’, ‘#’]
[‘9’, ‘#’, ‘93’, ‘#’, ‘#’]
[‘9’, ‘#’, ‘#’]
[‘#’]
Tips:二叉树的空指针是节点数+1,所以可以筛掉一部分用例,如题目给的那两个False。当然这道题要用上栈就更好了,等我后面再写写。
Code
class Solution:
def isValidSerialization(self, preorder: str) -> bool:
p = preorder.split(",")
n = len(p)
m = p.count("#")
if n // 2 != m - 1:
return False
cnt = 1
while cnt != 0:
tmp = []
idx = 0
cnt = 0
while idx < len(p):
if idx < len(p)-2 and p[idx]!="#" and p[idx+1] == "#" and p[idx+2]=="#":
tmp.append("#")
idx += 3
cnt += 1
else:
tmp.append(p[idx])
if idx == len(p)-3:
tmp.append(p[-2])
tmp.append(p[-1])
break
idx += 1
# print(idx,tmp)
if cnt > 0:
p = tmp
# print(p)
return len(p) == 1 and p[0] == "#"