leetcode刷题笔记之101. 对称二叉树

101. 对称二叉树

在上一题后自信打开下一题,想直接秒了结果被秒了
先来看看错误代码

# Definition for a binary tree node.
# 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: Optional[TreeNode]
        :rtype: bool
        """
        lresult=[]
        rresult=[]
        ltree=root.left
        rtree=root.right
        lresult=self.linorder(ltree,lresult)#错啦,不用赋值
        rresult=self.rinorder(rtree,rresult)#错啦,不用赋值
        print(lresult)
        print(rresult)
        if rresult==lresult:
            return "true"
        else:
            return "false"
    def linorder(self,node,result):
        if not node:
            return result#错啦,不用返回值
        self.linorder(node.left,result)
        result.append(node.val)
        self.linorder(node.right,result)
    def rinorder(self,node,result):
        if not node:
            return result#错啦,不用返回值
        self.rinorder(node.right,result)
        result.append(node.val)
        self.rinorder(node.left,result)

理想状态是将树一分为二,一个中序排列,另一个镜像中序排列,这样来看是不是一样,结果遇到以下例子
在这里插入图片描述
我的方法来看确实是镜像的,但是一个是左节点一个是右节点,所以并非镜像!

结果还是求助了deepseek,直接采用递归比较左右子树,妙啊,用一个递归比较左子树的左节点和右子树的右节点,只要不一样直接返回0,妙啊!

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: bool
        """
        if not root:
            return True
        return self.issame(root.left, root.right)
    
    def issame(self, lnode, rnode):
        if not lnode and not rnode:  # 如果两个节点都为空,则对称
            return True
        if not lnode or not rnode:   # 如果只有一个为空,则不对称
            return False
        # 检查当前节点的值是否相等,并递归检查左右子树
        return (lnode.val == rnode.val and 
                self.issame(lnode.left, rnode.right) and 
                self.issame(lnode.right, rnode.left))

逻辑是这样的的,方法的参数是左右节点,先判断左右节点是不是都为空,都为空即为对称,再看是否只有一个,只有一个则不对称。到下面递归的部分,首先左节点和右节点的值要一样,且后面两个and的值参考前两个条件,都没或者只有一个,通过三个and进行计算吗,最后return。

总结反思:
为什么一开始选择两个递归,感觉要判断左右的子树一不一样只要先进行一个中序排列,再看一不一样就行了,但是没想到的是中序并不能完整展示一个树的结构,见上述案例。
为什么没想到在一个递归中实现:对递归的应用还是不熟悉,没想到该return什么数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值