• 101. Symmetric Tree


    原题链接:https://leetcode.com/problems/symmetric-tree/description/

    我的思路

    这道题目大意是判断一颗二叉树是否是对称树,我看题目是“Easy”级别的,以为不难呢!然后我写出来如下实现:

    import java.util.Stack;
    
    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    
            public TreeNode(int val) {
                this.val = val;
            }
        }
    
        public static void main(String[] args) {
            TreeNode root = new TreeNode(1);
    
            TreeNode rootLeft = new TreeNode(2);
            TreeNode rootRight = new TreeNode(3);
            root.left = rootLeft;
            root.right = rootRight;
    
            TreeNode leftLeft = new TreeNode(3);
            TreeNode leftRight = null;
            rootLeft.left = leftLeft;
            rootLeft.right = leftRight;
    
            TreeNode rightLeft = new TreeNode(2);
            TreeNode rightRight = null;
            rootRight.left = rightLeft;
            rootRight.right = rightRight;
    
            Solution s = new Solution();
            System.out.println(s.isSymmetric(root));
        }
    
        public boolean isSymmetric(TreeNode root) {
            Stack<Integer> valStack = new Stack<>();
            inOrderTraverse(root, valStack);
            if (valStack.size() == 1) {
                return true;
            }
    
            Integer[] valArr = new Integer[valStack.size()];
            valStack.toArray(valArr);
            int index = valArr.length / 2;
            while (index >= 0) {
                if (valArr[index] == null) {
                    if (valArr[valArr.length - 1 - index] != null) {
                        return false;
                    }
                } else if (!valArr[index].equals(valArr[valArr.length - 1 - index])) {
                    return false;
                }
                index--;
            }
            return true;
        }
    
        public void inOrderTraverse(TreeNode node, Stack<Integer> stack) {
            if (node == null) {
                stack.push(null);
                return;
            }
    
            if (node.left == null && node.right == null) {
                stack.push(node.val);
                return;
            }
    
            inOrderTraverse(node.left, stack);
            stack.push(node.val);
            inOrderTraverse(node.right, stack);
        }
    }
    

    大致想法就是利用中序遍历,然后将遍历的节点值放入栈中,最后将栈转化为一个一维数组,然后对比数组里对称位置上的值是否一致!
    初看这个思路是没问题,但是总是有些测试用例运行时失败了。。。看来是我想错了,那就去看看官方答案吧!

    官方方法一:递归

    不得不说官方答案就是高端大气上档次啊!利用了镜子反射原理+递归实现了,代码也是极其简洁。就是镜子反射原理我还是不大能彻底理解啊:

    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    
            public TreeNode(int val) {
                this.val = val;
            }
        }
    
        public static void main(String[] args) {
            TreeNode root = new TreeNode(1);
    
            TreeNode rootLeft = new TreeNode(2);
            TreeNode rootRight = new TreeNode(3);
            root.left = rootLeft;
            root.right = rootRight;
    
            TreeNode leftLeft = new TreeNode(3);
            TreeNode leftRight = null;
            rootLeft.left = leftLeft;
            rootLeft.right = leftRight;
    
            TreeNode rightLeft = new TreeNode(2);
            TreeNode rightRight = null;
            rootRight.left = rightLeft;
            rootRight.right = rightRight;
    
            Solution s = new Solution();
            System.out.println(s.isSymmetric(root));
        }
    
        public boolean isSymmetric(TreeNode root) {
            return isMirror(root, root);
        }
    
        public boolean isMirror(TreeNode t1, TreeNode t2) {
            if (t1 == null && t2 == null) {
                return true;
            }
            if (t1 == null || t2 == null) {
                return false;
            }
            return (t1.val == t2.val) && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right);
        }
    
    }
    

    官方方法二:迭代

    这个方法主要还是利用了镜子反射原理,外加队列以及类似 BFS 的思路来实现的:

    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        q.add(root);
        while (!q.isEmpty()) {
            TreeNode t1 = q.poll();
            TreeNode t2 = q.poll();
            if (t1 == null && t2 == null) continue;
            if (t1 == null || t2 == null) return false;
            if (t1.val != t2.val) return false;
            q.add(t1.left);
            q.add(t2.right);
            q.add(t1.right);
            q.add(t2.left);
        }
        return true;
    }
    
  • 相关阅读:
    vue 手动挂载 $amount()
    Redis 主从配置
    DMA分区管理
    C# 构造函数里的base和this的区别
    SQL Server 数据库性能优化
    TCP和UDP的优缺点及区别
    Django框架初步应用简述
    前端vue框架应用雏形
    接口mock之moco
    python进阶(九)~~~协程、进程池、线程/进程/协程对比
  • 原文地址:https://www.cnblogs.com/optor/p/8538272.html
Copyright © 2020-2023  润新知