101. Symmetric Tree

https://leetcode.com/problems/symmetric-tree/description/
判断一棵树是否对称

思路1:naive的方法。先层序遍历,检查每一层是否对称。此时还不能说明是对称(为什么?见下图)
这里写图片描述
这棵树层序遍历是“对称”的,但是实际上不对称的

所以还要加一次中序遍历,若中序的结果是轴对称的,则符合。

注意,若只中序遍历,即使结果轴对称,也不符合,如下图中序遍历:3,2,1,2,3:
这里写图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
import queue
class Solution:
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root:
            return True
        q = queue.Queue()
        q.put(root)
        flag = True  #全局标志
        #层序遍历
        while not q.empty():
            n = q.qsize()  #层大小
            data = []
            for i in range(n):
                node = q.get()
                data.append(node.val)  #记录该层数据
                if node.left:  #左子入栈
                    q.put(node.left)
                if node.right:  #右子入栈
                    q.put(node.right)
            for i in range(n//2):  #检测该层是否对称
                if data[i] != data[n-1-i]:
                    flag = False
                    break

        self.nums = []  #记录遍历结果
        #中序遍历
        self.inorder(root)           
        n = len(self.nums)
        for i in range(n//2):  #检测是否对称
            if self.nums[i] != self.nums[n-1-i]:
                flag = False

        return flag

    def inorder(self, root):
        if root:
            self.inorder(root.left)
            self.nums.append(root.val)
            self.inorder(root.right)

思路2:递归。

class Solution:
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.isMirror(root, root)

    def isMirror(self, t1, t2):  #比较结点t1和t2
        if t1 == None and t2 == None:  #若都为空
            return True
        elif t1 == None or t2 == None:  #若上面不成立,说明不是都为空,即有一个为空,另一个不为空
            return False
        #否则都不为空
        #比较t1和t2的值是否相等,且递归比较t1的左子和t2的右子,以及t1的右子和t2的左子
        return t1.val == t2.val and self.isMirror(t1.left, t2.right) and self.isMirror(t1.right, t2.left)

思路3:还是层序。与思路1不同的是,分别对该树进行从左到右和从右到左的层序遍历,每次分别比较取出的结点,不相等则false

import queue
class Solution:
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        q = queue.Queue()
        q.put(root)
        q.put(root)
        #并不是严格的层序,每轮只取两个结点
        #分别表示从左到右和从右到左的遍历顺序
        while q.qsize() > 0:  
            t1 = q.get()
            t2 = q.get()
            if t1 == None and t2 == None:
                continue
            elif t1 == None or t2 == None:
                return False
            elif t1.val != t2.val:
                return False
            #t1的左右入队顺序无所谓,关键是t1要和t2对应上
            #t1取左,t2对应就要取右,反之亦然
            q.put(t1.left)
            q.put(t2.right)

            q.put(t1.right)
            q.put(t2.left)

        return True
购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值