码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】101. 对称二叉树

时间:2020-05-31 16:16:36      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:iss   tin   lang   als   结构   off   比较   lin   html   

题目描述

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

例如,二叉树?[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()方法的区别

【LeetCode】101. 对称二叉树

标签:iss   tin   lang   als   结构   off   比较   lin   html   

原文地址:https://www.cnblogs.com/melodyjerry/p/13019070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!