【二叉树】LeetCode 101. 对称二叉树【简单】
作者:互联网
给你一个二叉树的根节点 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