LeetCode:101.对称二叉树

这道题和第100道题目,判断两个树是否相等可以说是很相似,只不过这题是判断左右子树是不是对称的。其实在BFS遍历的时候,对左子树采用先左后右,对右子树采用先右后左即可。

迭代的做法

from collections import deque
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def check(p, q):
            if not p and not q:
                return True
            if not q or not p:
                return False
            if q.val != p.val:
                return False
            return True
        
        if not root:
            return True
        lt, rt = root.left, root.right
        deque1 = deque([lt])
        deque2 = deque([rt])
        while len(deque1) or len(deque2):
            p, q = deque1.popleft(), deque2.popleft()
            if not check(p, q):
                return False
            if p:
                deque1.append(p.left)
                deque1.append(p.right)
                deque2.append(q.right)
                deque2.append(q.left)
        return True

但是BFS并不适合这道题,因为效率没下面办法好(也可能是数据问题)

另一种办法是递归,采用DFS的思想。

对于每一个要匹配的两个节点,在比较完节点值之后,需要比较的是节点的左节点和另一个节点的右节点,以及节点的右节点和另一个节点的左节点。因为函数会直接递归到树的低端,所以是深度优先遍历。

from collections import deque
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def check(p, q):
            if not p and not q:
                return True
            if not q or not p:
                return False
            if q.val != p.val:
                return False
            return check(p.left, q.right) and check(p.right, q.left)
        if not root:
            return True
        return check(root.left, root.right)
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值