ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【二叉树】LeetCode 101. 对称二叉树【简单】

2022-05-18 21:31:08  阅读:155  来源: 互联网

标签:None right return self 二叉树 101 root LeetCode left


给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

 

输入:root = [1,2,2,null,3,null,3]
输出:false
 

提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
 

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

分析

对称二叉树的判定条件是:左子树的左孩子 == 右子树的右孩子 and 左子树的右孩子 == 右子树的左孩子

方法一:递归

对于递归的终止条件:

当两个节点都为空,进入下一个循环;

左右两个节点一个为空,一个不为空,一定不对称,返回false;

左右两个节点都不为空,但值不想等,一定不对称,返回false。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        # 左子树的左孩子==右子树的右孩子 and 左子树的右孩子 == 右子树的左孩子
        if root is None:
            return True
        return self.check(root.left, root.right)

    def check(self, left: TreeNode, right: TreeNode):
        # 递归的终止条件是两个节点都为空
        # 或左右有任意一个不为空,此时一定不对称
        # 或左右两个节点都不为空,但值不想等,也一定不对称
        if left is None and right is None:
            return True
        
        if left is None or right is None:
            return False

        if left.val != right.val:
            return False

        return self.check(left.left, right.right) and self.check(left.right, right.left)

方法二:循环队列(队列实现)

1. 队列初始存放树的左右两棵子树

2. 先弹出队列首部元素,根据上述递归的相同原则进行比较

3. 最后将当前(左节点的左孩子,右节点的右孩子)、(左节点的右孩子,右节点的左孩子)按照对应的位置入队

4. 比较直至队列为空,循环结束

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        # 左子树的左孩子==右子树的右孩子 and 左子树的右孩子 == 右子树的左孩子
        if root is None or (root.left is None and root.right is None):
            return True
        
        q = [(root.left, root.right)] # 定义队列
        while q:
            left, right = q.pop() # 先进先出

            # 若两个都为空,进入下一循环
            if left is None and right is None:
                continue
            
            # 若有一个为空,一个不为空,返回false
            if left is None or right is None:
                return False
            
            # 若两个都不为空,比较两个值是否相等
            if left.val != right.val:
                return False

            q.append((left.left, right.right))
            q.append((left.right, right.left))
        
        return True

 

标签:None,right,return,self,二叉树,101,root,LeetCode,left
来源: https://www.cnblogs.com/ariel-dreamland/p/16286370.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有