101. 对称二叉树
题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
假设这棵树张这个样子:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
分析
按照解答二叉树问题的惯例,我们给出两种解答(递归和非递归)。
首先,判断一棵二叉树是否对称的条件可以分为以下几种:
1. 根节点无左子树和右子树,此时一定是对称的,返回True。
2. 根节点有左子树或者右子树,但是只有一边,此时一定不对称,返回False。
3. 根节点两边子树都有,此时左子树的左节点等于右字数的右节点,右子树的左节点等于左节点的右节点,同时满足三个条件才可以返回True。
递归方案
按照常规的思维方式,我们先给出递归的解决方案:
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
return self.isMirror(root,root)
def isMirror(self, node1: TreeNode, node2: TreeNode) -> bool:
if not node1 and not node2: return True #条件1
if not node1 or not node2: return False #条件2
return node1.val == node2.val and self.isMirror(node1.left, node2.right) and self.isMirror(node1.right, node2.left) #条件3,递归判断
时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:
非递归方案
而非递归方案则使用了遍历的方法,将二叉树中的元素放在同个数组里,然后通过循环数组来判断它是不是对称数组。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
queue = [root]
while queue:
values = [i.val if i else None for i in queue]
if values != values[::-1]: return False
queue = [child for i in queue if i for child in (i.left, i.right)]
return True
时间复杂度:O(n)
空间复杂度:O(n)
实际运行结果:
小结
可以看出,两种方法消耗的资源差距并不大,但是递归的方法更加好理解一些。而遍历这种非遍历的方法并不是此题的最优解。
但是我还是列出来吧,毕竟按照惯例,递归和非递归两种方法都要有的。