一、题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树
[1,2,2,3,4,4,3]
是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true
但是下面这个
[1,2,2,null,3,null,3]
则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
引自:leetcode-cn.com/problems/sy…
题目链接:101. 对称二叉树
二、思路分析:
- 若二叉树为空或者树的左右子树的值不相等,则直接返回 false;
- 如果递归过程中满足下述2点,即相应二叉树是镜像对称的,否则不是镜像对称的。
- 比较 leftNode 的左子树 和 rightNode 的右子树的值是否相等;
- 比较 leftNode 的右子树 和 rightNode 的左子树的值是否相等;
三、AC 代码:
class Solution {
func isSymmetric(_ root: TreeNode?) -> Bool {
if (root == nil) {
return false;
}
return isMirror(root?.left, root?.right);
}
//! 镜对称方法
func isMirror(_ leftNode: TreeNode?, _ rightNode: TreeNode?) -> Bool {
if (leftNode == nil && rightNode == nil) {
return true;
}
if (leftNode == nil || rightNode == nil) {
return false;
}
let leftNodeValue : Int = leftNode?.val ?? 0;
let rightNodeValue : Int = rightNode?.val ?? 0;
if (leftNodeValue != rightNodeValue) {
// 首先比较先根结点的左右子树的值 不相等就没必要继续执行了
return false;
}
// 1.比较 leftNode 的左子树 和 rightNode 的右子树的值是否相等;
// 2.比较 leftNode 的右子树 和 rightNode 的左子树的值是否相等;
// 如果递归过程中上述2点均满足,即相应二叉树是镜像对称的,否则不是镜像对称的。
let leftFlag : Bool = isMirror(leftNode?.left, rightNode?.right);
let rightFlag : Bool = isMirror(leftNode?.right, rightNode?.left);
let leftRightFlag = leftFlag && rightFlag;
return leftRightFlag;
}
}
四、参考学习网址
本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情