镜像二叉树(递归版)

题目:

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

例如,二叉树 [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);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/wxdmw/p/13278382.html