331. 验证二叉树的前序序列化
思路:等价代换的想法,考虑叶子节点和其父节点,如果表述正确,则可以用一个叶子节点代替,即:图例中的右下角,6 # # 可以用 #代替,又由于是前序遍历,所以如果可以序列化的话,则可以用 数字 # #一直替换,到最后只剩一个根节点的 #,同理如果是中序遍历,则是 # 数字 # ,后序遍历则是 # # 数字
使用堆栈进行消消乐即可
class Solution:
def isValidSerialization(self, preorder: str) -> bool:
stack = []
k = 0
preorder = preorder.split(",")
for i in preorder:
stack.append(i)
k += 1
while(k>=3 and stack[-1] == stack[-2] == "#" and stack[-3].isdigit()):
stack.pop(-2)
stack.pop(-2)
k -= 2
while(k>=3 and stack[-1] == stack[-2] == "#" and stack[-3].isdigit()):
stack.pop(-2)
stack.pop(-2)
k -= 2
return True if stack == ["#"] else False
时间复杂度O(n)