镜像二叉树(递归版)
题目:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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); } } } }