leetCode第101题 对称二叉树
链接:https://leetcode-cn.com/problems/symmetric-tree
给你一个二叉树的根节点 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
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
看二叉树是不是二叉树就是比较对称位置上的结点的值是不是相等,问题的关键是怎么挑选出这两个结点刚好是在对称位置上。
从示例1的图似乎能找到些什么。
如果二叉树是对称的话那么左节点的左孩子等于右结点的右孩子
左结点的右孩子等于右结点的左孩子
那么完全可以通过递归的方式自顶向下进行比较
构造递归函数,作用:比较左结点的右孩子是否等于右结点的左孩子以及左节点的左孩子是否等于右结点的右孩子
明确退出递归的条件:当已经到了树的最底层,返回真
当有一边结点已经为空,另外一边却不为空,肯定不对称,返回假
当两个结点的值不相等,返回假
否则,调用自身,继续比较
## python3
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:
if root == None:
return True
return self.deepcheck(root.left,root.right)
def deepcheck(self,left: TreeNode,right: TreeNode) ->bool:
if left == None and right == None: # 终止条件,遍历到了最深的结点
return True
if left == None or right == None: # 有一边为了空,另一半却不为空,肯定不对称
return False
if left.val != right.val: ## 值不相等
return False
## 调用自身,递归地比较左结点的左孩子和右结点地的孩子
## 以及比较左节点的右孩子和右节点的左孩子
return self.deepcheck(left.left,right.right) and self.deepcheck(left.right,right.left)
用循环迭代的方式实现
需要借助队列这种数据结构
同样看示例1
当root为空或只有root一个结点时,返回真
否则直接入队
然后进入循环,成双的出队
将出队的元素比较值的大小,不相等直接返回假,否则,将结点的左孩子和后结点的右孩子入队,再将前结点的右孩子和后结点的左孩子入队
进入下一循环,直到队列为空
## python3
class Solution1:
def isSymmetric(self, root: TreeNode) -> bool:
q = []
u = root.left
v = root.right
if root == None or (u == None and v == None):
return True
q.append(u)
q.append(v)
while len(q) != 0:
u = q.pop(0)
v = q.pop(0)
if u == None and v == None :
continue
if (u == None or v == None) or u.val != v.val: #进一步判断是否只有一边有结点,或两个结点值不一样
return False
q.append(u.left)
q.append(v.right)
q.append(u.right)
q.append(v.left)
return True