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()方法的区别

  • 相关阅读:
    UILocalNotification实现本地的闹钟提醒的方法
    自定义UITableViewCell:Cell高度、分割线、间距等
    第三方苹果开发库之ASIHTTPRequest(翻译版)
    字符串NSString和数组NSArray操作
    MFMailComposeViewController发送邮件的实例
    IOS开发之手势—UIGestureRecognizer 共存
    ios 画图总结 [转]
    iOS-响应上下左右滑动手势
    MFMessageComposeViewController程序内发送短信息的实例
    FIELDSYMBOLS 学习—转载
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/13019070.html
Copyright © 2011-2022 走看看