【Leetcode 二叉树】 对称二叉树(101)
题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
解答
分析:先序、中序、后序遍历的结果不能用来比较是否对称。应该用(头-左-右)和(头-右-左)的遍历顺序比较。(头-左-右)就是先序遍历,(头-右-左)不是先序、中序、后序。
递归,对称的条件:先序遍历(头-左-右)和(头-右-左)遍历过程一致。
用Null判断树的结尾。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 比较两种遍历结果是否相等 1: 头--左--右 2:头--右--左
class Solution:
def isSymmetric(self, root):
if not root or (not root.left and not root.right):
return True
def compare_node(node1, node2):
if node1 == None and node2 == None: # node1 node2的子树比较到底了,说明对称
return True
if node1 == None or node2 == None: # 其中一个为空,不对称
return False
if node1.val != node2.val: # 值不等
return False
ans1 = compare_node(node1.left, node2.right) # 如果对称,node1.left应该等于node2.right
if not ans1: # 不等
return False
else: # node1.left等于node2.right,再比较node1.right==node2.left
return compare_node(node1.right, node2.left)
return compare_node(root.left, root.right)