对称的二叉树

题目:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路一:
递归

代码:
写法一:(判断子节点)

class Solution:
    def isSymmetrical(self, pRoot):
        if not pRoot: return True
        if pRoot.left and pRoot.right:
            if pRoot.left.val != pRoot.right.val: return False
            else: return self.helper(pRoot.left, pRoot.right)
        if pRoot.left or pRoot.right: return False
        return True
    
    def helper(self, p1, p2):
        if (not p1.left and p2.right) or (p1.left and not p2.right)\
        or (not p1.right and p2.left) or (p1.right and not p2.left):
            return False
        if (p1.left and p2.right) and (not p1.right and not p2.left):
            if p1.left.val == p2.right.val: return self.helper(p1.left, p2.right)
            else: return False
        if (p1.right and p2.left) and (not p1.left and not p2.right):
            if p1.right.val == p2.left.val: return self.helper(p1.right, p2.left)
            else: return False
        if p1.left and p2.right and p1.right and p2.left:
            if (p1.left.val != p2.right.val) or (p1.right.val != p2.left.val): return False
            return self.helper(p1.left, p2.right) and self.helper(p1.right, p2.left)
        return True

写法二:(判断父节点)

class Solution:
    def isSymmetrical(self, pRoot):
        if not pRoot: return True
        return self.helper(pRoot.left, pRoot.right)
    
    def helper(self, p1, p2):
        if (not p1 and p2) or (p1 and not p2): return False
        if not p1 and not p2: return True
        if p1.val != p2.val: return False
        return self.helper(p1.left, p2.right) and self.helper(p1.right, p2.left)

思路二:
DFS

代码:

class Solution:
    def isSymmetrical(self, pRoot):
        if not pRoot: return True
        stack = []
        stack.append(pRoot.left)
        stack.append(pRoot.right)
        while stack:
            p1 = stack.pop()
            p2 = stack.pop()
            if (not p1 and p2) or (p1 and not p2): return False
            if not p1 and not p2: continue
            if p1.val != p2.val: return False
            stack.append(p1.left)
            stack.append(p2.right)
            stack.append(p1.right)
            stack.append(p2.left)
        return True

思路三:
BFS(和思路二差不多)

代码:

class Solution:
    def isSymmetrical(self, pRoot):
        if not pRoot: return True
        queue = []
        queue.append(pRoot.left)
        queue.append(pRoot.right)
        while queue:
            p1 = queue.pop(0)
            p2 = queue.pop(0)
            if (not p1 and p2) or (p1 and not p2): return False
            if not p1 and not p2: continue
            if p1.val != p2.val: return False
            queue.append(p1.left)
            queue.append(p2.right)
            queue.append(p1.right)
            queue.append(p2.left)
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值