• 领扣(LeetCode)对称二叉树 个人题解


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

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

    说明:

    如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

    (算法萌新,轻拍求指点 XD 此题思路参考了官方题解。)

    由于是很久没有接触这种类型的题目了,所以第一次拿到有点懵。还是看了题解才找回感觉。
    看这个二叉树是不是对称的,主要是看二叉树左边和右边的节点是不是各自相反。每一层都是左右颠倒。
    所以通过递归,判断左树和右树相反的节点的值是不是相同。
    如果两边都为空,正常退出,说明递归到树的底部了。
    如果有一边空了另外一半没空,说明有一边的节点没了,另外一半还在,肯定不是对称的树
    如果两边对称,继续递归节点的左右节点,直到递归完全或者发现不对称。
    代码如下:
    递归:

     1 class Solution {
     2     public boolean isSymmetric(TreeNode root) {
     3         return isMirror(root, root);
     4     }
     5 
     6     boolean isMirror(TreeNode t1, TreeNode t2) 
     7     {
     8         if (t1 == null && t2 == null)
     9             return true;
    10         if(t1 == null ||t2==null)
    11             return false;
    12         if(t1.val==t2.val)
    13         {
    14             return true && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right);
    15         }
    16         return false;
    17     }
    18 
    19 }

    第二种方法是迭代,虽然知道做法和用意,但是在使用上不够熟练。大概思路就是把待处理的节点入队,然后依次出队处理,获取新的待处理节点入队。
    在处理时出现了一个问题,在迭代时遇到两个都为空的节点不能直接退出循环,虽然可能是二叉树的底部,但是因为这时队列里可能还有其他未处理的节点等待处理,不能直接返回。
    代码如下:
    迭代:

     1 class Solution {
     2     
     3     
     4     public boolean isSymmetric(TreeNode root)
     5     {
     6         Queue<TreeNode> queue=new LinkedList<TreeNode>();
     7         queue.add(root);
     8         queue.add(root);
     9         while(!queue.isEmpty())
    10         {
    11             TreeNode t1=queue.poll();
    12             TreeNode t2=queue.poll();
    13             if(t1==null && t2==null)
    14                 continue;
    15             if(t1==null || t2==null)
    16             {
    17                 return false;
    18             }
    19             if(t1.val!=t2.val)
    20                 return false;
    21             queue.add(t1.left);
    22             queue.add(t2.right);
    23             queue.add(t1.right);
    24             queue.add(t2.left);
    25             
    26         }
    27         return true;
    28     }
    29 }
  • 相关阅读:
    管理经济学之第三章(消费者效用分析)
    管理经济学之第二章(供求分析)
    JVM之GC回收信息详解
    管理经济学之第一章(导论)
    JAVA的引用类型
    6.jQuery动画和队列,简单的queue()入队和dequeue()出队实现
    5.jQuery实现简单的on()和trigger()方法
    4.jQuery的clone()方法和data()方法
    3.jQuery操作DOM对象的方法
    2.jQuery简单实现get()和eq()和add()和end()方法
  • 原文地址:https://www.cnblogs.com/axiangcoding/p/9879329.html
Copyright © 2020-2023  润新知