zoukankan      html  css  js  c++  java
  • 【LeetCode】101. 对称二叉树

    题目描述

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

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

  • 相关阅读:
    《需求工程--软件建模与分析》读书笔记一
    软件工程概论课程总结及给老师的意见
    梦断代码阅读笔记之三
    梦断代码阅读笔记之二
    第二阶段小组冲刺第七天总结
    软件工程第十一周学习进度条
    用户场景描述
    软件工程第九、十周学习进度条
    个人工作总结
    软件工程第八周学习进度条
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/13019070.html
Copyright © 2011-2022 走看看