解法一: 判断二叉树的前序序列化是否是正确的,可以采用消除的方法,我们将叶子节点向上消除,也就是确定一个节点如果是叶子节点,也就是它的左右子节点都为空。则把此节点替换为空节点,两个空子节点删除。这样递归执行,最后如果只剩根节点替换后留下的#说明符合条件。
def isValidSerialization(self, preorder):
"""
:type preorder: str
:rtype: bool
"""
stack = []
for i in preorder.split(","):
stack.append(i)
while len(stack) > 2 and stack[-1] == "#" and stack[-2] == "#":
if stack[-3] == "#":
return False
stack.pop()
stack.pop()
stack.pop()
stack.append("#")
return len(stack) == 1 and stack.pop() == "#"
解法二: 根据图和树的特点,所有节点的出入度相加等于0。
计算树所有结点的出入度之和,每个非空节点出度都为2,入度为1。
这样的话需要注意根节点没有入度。为了保证是合法的二叉树,需要把出度看作提供锚点,入度看作消耗锚点。
这样每个非空节点提供两个消耗一个,每个空节点消耗一个。要保证在遍历完所有节点之前总和不会小于0,
因为小于0就无法连接新的节点了,遍历完时等于0。注意初始化为1是因为根节点没有入度所以不会消耗一个,
而我们在遍历时都是减一加二,所以初始为1。
def isValidSerialization(self, preorder):
"""
:type preorder: str
:rtype: bool
"""
diff = 1
for i in preorder.split(","):
diff -= 1
if diff < 0:
return False
if i != "#":
diff += 2
return diff == 0