zoukankan      html  css  js  c++  java
  • 镜像二叉树(递归版)

    题目:

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/symmetric-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    分析:

    这道题我的第一反应又是递归,果然是对递归爱的深沉,看见二叉树就想到递归。不过,虽然用递归来解没什么问题,但是我的思路有大问题,导致代码并不简洁,消耗内存和运行时间也比较高。

    我的思路是既然要判断二叉树是否为镜像对称,那么顶层的第一个节点可以忽略不计,因为它不会影响到最终的结果,将整个二叉树分为左右两个子树,然后根据子树的节点按顺序构建两个集合。左子树每层节点从左到右添加进左子树集合,右子树每层节点从右到左添加进右子树集合。如果二叉树为镜像二叉树,那么左右子树的集合equals结果应为true。

    代码:

    /**
     * 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) {
            if (root == null) {
                return true;
            }
            List<Integer> left = new ArrayList<>();
            List<Integer> right = new ArrayList<>();
            addSonLeft(root.left, left);
            addSonRight(root.right, right);
            return left.equals(right);
        }
    
        public void addSonLeft(TreeNode root, List<Integer> list) {
            if (root == null) {
                list.add(null);
            } else {
                list.add(root.val); 
                if (root.left != null || root.right != null) {
                    addSonLeft(root.left, list);
                    addSonLeft(root.right, list);
                }
            }
        }
    
        public void addSonRight(TreeNode root, List<Integer> list) {
            if (root == null) {
                list.add(null);
            } else {
                list.add(root.val); 
                if (root.left != null || root.right != null) {
                    addSonRight(root.right, list);
                    addSonRight(root.left, list);
                }
            }
        }
    }
  • 相关阅读:
    详解ASP.NET的内置对象
    如何架设FTP服务器
    输出JSON问题
    new , virtual , override
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    Java回顾之I/O
    数据结构之栈和队列
    Java回顾之多线程同步
    设计模式之行为型模式
    Java回顾之网络通信
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13278382.html
Copyright © 2011-2022 走看看