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

解法一: 判断二叉树的前序序列化是否是正确的,可以采用消除的方法,我们将叶子节点向上消除,也就是确定一个节点如果是叶子节点,也就是它的左右子节点都为空。则把此节点替换为空节点,两个空子节点删除。这样递归执行,最后如果只剩根节点替换后留下的#说明符合条件。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值