题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
來源:力扣(LeetCode)
解题思路
-
遍历树:使用递归思路;树的遍历包含了前序遍历、中序遍历、后序遍历。
-
镜像:建立子函数,比较左右子节点。若我们使用前序遍历,从根节点出发。从第二层开始,以左子树的根节点与右子树的根节点为比较基础 => `compare(left_root, right_root)
- 子函数当中:若比较值左右同为
Null
,则返回True
;若左右任一为Null
,则返回False
;若左右不相同,则返回False
;剩馀情况为左右皆有值且相等,则使用compare()
往树的深度继续比较:- 比较左子树的左子节点与右子树的右子节点是否相等 =>
compare(left_root.left, right_root.right)
- 比较左子树的右子节点与右子树的左子节点是否相等=> `compare(left_root.right, right_root.left)
- 比较左子树的左子节点与右子树的右子节点是否相等 =>
- 子函数当中:若比较值左右同为
-
注意事项:要考虑下二叉树的值相同时,但子树的左右子节点存在
null
指针,而造成不为对称的二叉树的问题。
Python代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def compare(left_root, right_root):
# 边界条件
if not left_root and not right_root:
return True
if not left_root or not right_root:
return False
# 主要算法
if left_root.val != right_root.val:
return False
return compare(left_root.left, right_root.right) and compare(left_root.right, right_root.left)
if not root:
return True
return compare(root.left, root.right)