来自北大算法课的Leetcode题解:101. 对称二叉树

这篇博客介绍了如何检查二叉树是否对称,提供了两种解法,一种是递归,另一种是迭代。递归解法通过比较左右子树的对称性实现,而迭代解法利用栈来分别处理左子树和右子树的顺序。代码示例使用Python实现,展示了详细的逻辑步骤。
摘要由CSDN通过智能技术生成

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

很综合的考了二叉树的遍历方式,无论递归还是迭代都值得再好好看看

  • 解法1(T85% S52%):递归,递归函数有两个变量left和right,首先要满足left和right的值一样,然后递归 left的左子树和right的右子树要相等,t
    • 注意,相等不是根节点==,而是满足递归函数
  • 解法2(T85% S82%):迭代,类似于迭代法先序遍历,不过升级点在于左子树按照“根-左-右”做,右子树按照“根-右-左”做。具体来说维护lstackrstack两个数据结构,初始值都是只有root,每次分别弹出lnodernode判断是否相等(还要判断是否为None),如果不相等代表根的值就不一样,直接False;如果相等则lstack加入lnode的右子树,把它存下来之后要回溯,同样的rstack加入当前rnode的左子树,然后lstack一左到底,rstack一右到底,期间要满足始终相等
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # 解法2 迭代
        lstack, rstack = [root], [root]
        while lstack and rstack:
            lnode, rnode = lstack.pop(), rstack.pop()
            if not lnode and not rnode: continue
            elif not lnode or not rnode: return False
            if lnode.val != rnode.val: return False

            lstack.append(lnode.right)
            rstack.append(rnode.left)

            while True:
                lnode, rnode = lnode.left, rnode.right
                if not lnode and not rnode: break
                elif not lnode or not rnode: return False
                if lnode.val != rnode.val: return False
                lstack.append(lnode)
                rstack.append(rnode)
            
        return True
        

    def otherSolution(self, root):
        # 解法1 递归
        def isSym(left, right):
            if not left and not right: return True
            elif not left or not right: return False

            if left.val != right.val: return False
            return isSym(left.left, right.right) and isSym(left.right, right.left)

        return isSym(root.left, root.right)

root = TreeNode(2)
root.left = TreeNode(3)
root.right = TreeNode(3)
root.left.left = TreeNode(4)  
root.left.right = TreeNode(5)
# root.right.left = TreeNode(4)
root.right.right = TreeNode(4)    

Solution().isSymmetric(root)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值