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

     老规矩,使用队列辅助完成广度优先遍历操作。

    从根节点开始将左右孩子压入队列。

    然后不停的从队列出去首2位元素(left,right)进行比较,

    如相等,再将left节点的left节点与right节点的right节点。

    这里有点绕人,需要结合图片理解

    在比较完根节点的2个子孩子2和2后,根据镜像的性质,后续要比较的应该是

    最左边的3和最右边的3,以此类推。

    时间O(n)(每个元素都需要遍历一遍),空间O(n)(完全二叉树情况下叶子节点占n/2)

        public boolean isSymmetric(TreeNode root) {
            if (root==null || (root.left==null && root.right==null))  return true;
            Deque<TreeNode> queue = new LinkedList<TreeNode>();
            // 从根节点的左右孩子处开始比较
            queue.add(root.left);
            queue.add(root.right);
            while(!queue.isEmpty()){
                // 依次取出队首的2个元素(这里的left与right并不一定拥有同一个父节点)
                // 这里需要结合下文的add操作理解
                TreeNode left = queue.poll();
                TreeNode right = queue.poll();
                // 左右孩子都为空,则直接进入一下次比较
                if (left==null && right==null) continue;
                // 在上一次判断的基础上,左右孩子只有一个为空,必然存在左右孩子不等
                if (left==null || right==null) return false;
                if (left.val!=right.val) return false;
                // 注意进入队列的顺序,由于题目要求的对称性质,所以要先将
                // 最左边的元素与最右边的元素压入队列,然后是次左次右
                queue.add(left.left);
                queue.add(right.right);
                queue.add(left.right);
                queue.add(right.left);
            }
            return true;
        }
    争取早日不再是一只菜鸡
  • 相关阅读:
    Eclipse编辑JS响应慢,复制粘贴卡顿的解决方案
    Oracle 通过字段名查询其所在的表
    spring mvc流转控制说明
    Iterable(迭代器)的用法
    spring事务配置详解
    创建第一个Hiberntae工程
    spring3.0注解
    Ext中Grid重新load设置URL
    spring框架设计理念(上)
    Eclipse快捷键大全
  • 原文地址:https://www.cnblogs.com/jchen104/p/14631479.html
Copyright © 2011-2022 走看看