LeetCode101. 对称二叉树

Posted MelodyHub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode101. 对称二叉树相关的知识,希望对你有一定的参考价值。

题目描述

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

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

进阶:

  • 你可以运用递归迭代两种方法解决这个问题吗?

题解思路

阅读完题目,脑子里先是想到了这种数据结构。

栈的一个特性:先进后出、后进先出。

根据这个特性,很容易地搞定递归实现。

但是迭代地话,用队列更容易理解。

队列的一个特性:先进先出,后进后出。

这题比较容易,直接看代码和注释即可。

递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 两树都为null,肯定对称
        if (root == null) { return true; }

        // 比较 左子树root.left 与 右子树root.right 这两棵子树是否对称
        return compareTree(root.left, root.right);
    }

    /* 递归实现 */
    private boolean compareTree(TreeNode node1, TreeNode node2) {
        // 首先比较 node1 与 node2 这两个节点的值是否相等
        // 两节点均同时为null时
        if (node1 == null && node2 == null) {
            return true;
        }
        // 最多一个节点为null时,当然还得考虑“值不空但不同”的情况
        if (node1 == null || node2 == null || node1.val != node2.val) { // TreeNode.val返回的是该节点的值
            return false;
        }

        // 再递归比较 node1 的左子树与 node2 的右子树是否对称,node1 的右子树与 node2 的左子树是否对称
        return compareTree(node1.left, node2.right) && compareTree(node1.right, node2.left);
    }
}

迭代

class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 两树都为null,肯定对称
        if (root == null) { return true; }
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root.left);
        queue.add(root.right);

        while (!queue.isEmpty()) {
            // 每次出队两个节点 node1 和 node2
            TreeNode node1 = queue.poll();
            TreeNode node2 = queue.poll();
            
            // 首先比较 node1 与 node2 这两个节点的值是否相等
            if (node1 == null && node2 == null) {
                continue;
            }
            // 最多一个节点为null时,当然还得考虑“值不空但不同”的情况
            if (node1 == null || node2 == null || node1.val != node2.val) { // TreeNode.val返回的是该节点的值
                return false;
            }

            // 再将 node1 的左节点与 node2 的右节点一起入队(以便两节点一起出队,进行比较)
            queue.add(node1.left);
            queue.add(node2.right);
            // 再将 node1 的右节点与 node2 的左节点一起入队(以便两节点一起出队,进行比较)
            queue.add(node1.right);
            queue.add(node2.left);
        }

        return true;
    }
}

复杂度分析

无论是递归,还是迭代,

时间复杂度均为:O(n)

空间复杂度均为:O(n)

补充

Java 队列的add()方法和offer()方法的区别

以上是关于LeetCode101. 对称二叉树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第101题—对称二叉树—Python实现

LeetCode 101.对称二叉树 - JavaScript

⭐算法入门⭐《二叉树》简单03 —— LeetCode 101. 对称二叉树

LeetCode-101-对称二叉树

精选力扣500题 第64题 LeetCode 101. 对称二叉树c++/java详细题解

LeetCode 101. 对称二叉树(二叉树,递归)