LeetCode-探索-初级算法-树-3. 对称二叉树(个人做题记录,不是习题讲解)

LeetCode-探索-初级算法-树-3. 对称二叉树(个人做题记录,不是习题讲解)

LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/

  1. 对称二叉树
  • 语言:java

  • 思路:尝试写了一个非递归的,但应该中间判断有问题,一直是错的,花费时间过多,得不偿失,就放弃了。

  • 参考代码1(1ms):

    https://blog.csdn.net/qq_39313597/article/details/89135625

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            if(root == null){
                return true;
            }
            
            return isSymmetric(root.left,root.right);
        }
        
        public boolean isSymmetric(TreeNode n1,TreeNode n2) {
            if(n1 == null || n2 == null){
                return n1 == n2;
            }
            
            if(n1.val != n2.val){
                return false;
            }
            
            return isSymmetric(n1.left,n2.right) && isSymmetric(n1.right,n2.left);
        }
    }
    
  • 参考代码2(1ms):发现和上面博主代码基本没差。思路即通过调用另一个回调函数判断当前树的左右子树是否相同。判断相同的方式即左子树左节点要和右子树右节点相同,左子树右节点要和右子树左节点相同。

    class Solution {
        
        public boolean isSymmetric(TreeNode root) {
            if (root == null) {
                return true;
            }
            return isSymmetric(root.left, root.right);
        }
        
        private boolean isSymmetric(TreeNode left, TreeNode right) {
            if (left == null && right == null) {
                return true;
            }
            if (left == null || right == null) {
                return false;
            }
            if (left.val != right.val) {
                return false;
            }
            return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
        }
    }
    
  • 参考代码3(0ms):和参考代码2其实差不多,只不过把对头节点的判断也归类到递归函数中罢了

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            return isMirror(root,root);
        }
        public static boolean isMirror(TreeNode left,TreeNode right){
            if(left == null && right == null){
                return true;
            }
            if(left == null || right == null){
                return false;
            }
            if(left.val != right.val){
                return false;
            }
            return isMirror(left.left,right.right) && isMirror(left.right, right.left);
        }
    }
    
  • 参考代码4非递归(3ms):利用bfs常用的queue来对比两个树是否对称。即左子树每次存入左和右,右子树每次存入右和左,然后进行比较

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            if (root == null) return true;
            Queue<TreeNode> q1 = new LinkedList<>();
            Queue<TreeNode> q2 = new LinkedList<>();
            q1.add(root);
            q2.add(root);
            while (!q1.isEmpty() && !q2.isEmpty()) {
                TreeNode left = q1.poll();
                TreeNode right = q2.poll();
                if (left == null && right == null) continue;
                if (left == null || right == null) return false;
                if (left.val != right.val) return false;
                q1.add(left.left);
                q1.add(left.right);
                q2.add(right.right);
                q2.add(right.left);
            }
            return q1.isEmpty() && q2.isEmpty();
        }
    }
    
  • 参考后重写-递归(1ms):莫名就比参考的满了0ms

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSymmetric(TreeNode root) {
            return isSymmetric(root,root);
        }
        public boolean isSymmetric(TreeNode left,TreeNode right){
            if(left==null&&right==null)
                return true;
            if(left==null||right==null)
                return false;
            if(left.val!=right.val)
                return false;
            return isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
        }
    }
    
  • 参考后重写-非递归(2ms):莫名比参考的快了1ms。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSymmetric(TreeNode root) {
            Queue<TreeNode> left = new LinkedList();
            Queue<TreeNode> right = new LinkedList();
            TreeNode l,r;
            left.offer(root);
            right.offer(root);
            while(!left.isEmpty()&&!right.isEmpty()){
                l = left.poll();
                r = right.poll();
                if(l==null&&r==null)
                    continue;
                if(l==null||r==null)
                    return false;
                if(l.val!=r.val)
                    return false;
                left.offer(l.left);
                left.offer(l.right);
                right.offer(r.right);
                right.offer(r.left);
            }
            return left.isEmpty()&&right.isEmpty();
        }
    }
    
发布了60 篇原创文章 · 获赞 6 · 访问量 5536

猜你喜欢

转载自blog.csdn.net/Ashiamd/article/details/102263408