[LeetCode 101. 对称二叉树] |刷题打卡

149 阅读1分钟

一、题目描述:

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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. 对称二叉树

二、思路分析:

  1. 若二叉树为空或者树的左右子树的值不相等,则直接返回 false;
  2. 如果递归过程中满足下述2点,即相应二叉树是镜像对称的,否则不是镜像对称的。
  3. 比较 leftNode 的左子树 和 rightNode 的右子树的值是否相等;
  4. 比较 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 月闯关活动」, 点击查看 活动详情