剑指Offer28-对称的二叉树
每日几道leetcode刷刷题!
JZ-Offer28
题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
代码
# 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:
if not root:
return True
def recur(L, R): #递归
#判断的条件
if not L and not R:
return True
if not L or not R or L.val != R.val:
return False
return recur(L.left, R.right) and recur(L.right, R.left)
return recur(root.left, root.right)
思路
注意,本题比较的不是哪两个节点,而是比较的是两个树
,因为是不停的判断左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点是否相同,所以采用递归的方法会比较符合本题。在递归遍历的过程中,也是要同时遍历两棵树。
特殊处理: 若根节点 root 为空,则直接返回 true 。
终止条件:
- 当 L 和 R 同时越过叶节点: 此树从顶至底的节点都对称,因此返回 true ;
- 当 L 或 R 中只有一个越过叶节点: 此树不对称,因此返回 false ;
- 当节点 L 值 != 节点 RR 值: 此树不对称,因此返回 false ;
递推工作:
- 判断两节点 L.left 和 R.right 是否对称,即 recur(L.left, R.right) ;
- 判断两节点 L.right 和 R.left 是否对称,即 recur(L.right, R.left) ;
(本题解参考K神)