二叉树--对称二叉树

Posted 算法和数据结构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树--对称二叉树相关的知识,希望对你有一定的参考价值。

来源:LeetCode

难度:简单

描述:

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


示例1:

二叉树 [1,2,2,3,4,4,3] 是对称的。


示例2:

二叉树[1,2,2,null,3,null,3] 则不是镜像对称的:

二叉树(三)--对称二叉树


分析:

        所谓对称二叉树,就是以根节点为中心点做垂直线,左右折叠节点位置和数值完全一样的二叉树。注意是折叠,不是平移

        上面的特点在二叉树上的体现就是根节点的左节点等于右节点,且左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点...,依次类推扩散,具体解法思路步骤如下


解题


方法一:递归

思路:如分析,从根节点开始向左右节点扩散,依次比较左节点和右节点、左节点的左节点和右节点的右节点、左节点的右节点和右节点的左节点...,即左边指针往左走,右边指针就往右走,左边指针往右走,右边指针就往左走,直至二叉树遍历完毕或者节点值不相等


代码:

 1public boolean isSymmetric(TreeNode root) {
2    if (root == null) {
3        return true;
4    }
5    return isSymmetric(root.left, root.right);
6}
7
8public boolean isSymmetric(TreeNode left, TreeNode right) {
9    //子节点遍历完毕
10    if (left == null && right == null) {
11        return true;
12    }
13    if (Objects.nonNull(left) && Objects.nonNull(right)) {
14        //先判断本节点值是否相等
15        if (left.val != right.val) {
16            return false;
17        }
18        //左节点往左走,右节点就往右走
19        //左节点往右走,右节点就往左走
20        return isSymmetric(left.left, right.right) & isSymmetric(left.right, right.left);
21    }
22    return false;
23}

时间复杂度:O(n) 

空间复杂度:O(n) 



方法二:队列迭代法

思路:和方法一思路一致,只不过用两个队列来分别存储左子树和右子树的节点,并挨个进行比较,入队时,左子树入左子节点,右子树就入右子节点,左子树入右子节点,右子树就入左子节点...依次类推


代码:

 1public boolean isSymmetric(TreeNode root) {
2    if (root == null) {
3        return true;
4    }
5    return check(root);
6}
7
8public boolean check(TreeNode root) {
9    //用两个队列分别存储根节点左右子树的节点
10    Queue<TreeNode> left = new LinkedList<>();
11    Queue<TreeNode> right = new LinkedList<>();
12    left.offer(root.left);
13    right.offer(root.right);
14    while (!left.isEmpty() && !right.isEmpty()) {
15        TreeNode treeNodeLeft = left.poll();
16        TreeNode treeNodeRight = right.poll();
17        if (treeNodeLeft == null && treeNodeRight == null) {
18            continue;
19        }
20        if (Objects.nonNull(treeNodeLeft) && Objects.nonNull(treeNodeRight)) {
21            if (treeNodeLeft.val != treeNodeRight.val) {
22                return false;
23            }
24            //左节点往左走,右节点就往右走
25            left.offer(treeNodeLeft.left);
26            right.offer(treeNodeRight.right);
27            //左节点往右走,右节点就往左走
28            left.offer(treeNodeLeft.right);
29            right.offer(treeNodeRight.left);
30        } else {
31            return false;
32        }
33    }
34    return true;
35}

时间复杂度:O(n) 

空间复杂度:O(n) 


以上仅是个人思路解法,觉得还不错欢迎点赞关注分享


往期精彩推荐



扫描下方二维码,关注公众号,更多精彩等你发现


以上是关于二叉树--对称二叉树的主要内容,如果未能解决你的问题,请参考以下文章

面试题28:对称的二叉树

剑指offer面试题 28. 对称的二叉树

101. 对称二叉树

101. 对称二叉树

60.对称的二叉树

剑指offer:对称的二叉树