6.二叉树之对称二叉树|Java 刷题打卡

341 阅读3分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看<活动链接>

【Java 刷题打卡】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

那就干吧! 这个专栏都是刷的题目都是关于二叉树的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法2121112。二叉树的内容不多,但是都是每个程序员必备的,对了解红黑树、B+树、LSM树都非常有帮助等等

WAL+LSM-tree实现的leveldb和rocksdb

B+ 树的mysql

(HBASE) - LSM-tree的架构把random write转成sequential write,多层的compaction和lookup,存在写放大和读放大

TokuDB索引结构--Fractal Tree

还有更多,值得咱们发掘。

leecode 101. 对称二叉树

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

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

图片.png

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

图片.png

进阶:

你可以运用递归和迭代两种方法解决这个问题吗?


参考代码

定义一颗树

class TreeNode {
    int val;          // 头结点
    TreeNode left;    // 左子树
    TreeNode right;   // 右子树

    TreeNode(int x) {
        val = x;
    }
}


// 测试方法
 public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        treeNode.left = new TreeNode(2);
        treeNode.right = new TreeNode(3);
        System.out.println("xxxx结果 = " + preorderTraversal(treeNode));
}        
  1. 要知道这是一棵树,只是通过数组的形式表现出来的

图片.png

简单的用这颗树来举例

因为需要对称,我们入口放入两颗一模一样的树p,q,如果同一棵树p,q的根节点相同,p树的左节点不为空并且q的右节点不为空 && q树的左节点不为空并且p的右节点不为空

或者左右节点都为空,只要出现一边为空,一边不为空,就一定不是对称二叉树。

JAVA语言版 递归


 public boolean isSymmetric2(TreeNode root) {
        return check(root, root);
    }

    public boolean check(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
    }

JAVA语言版 迭代

  1. 定义一个队列(先进先出)

  2. 将这颗树加入到队列2次

  3. 队列长度 > 0

  4. 在取出队列的两棵树u,v

  5. 都为空,则继续

  6. 一个为空,一个不为空,则不是对称二叉树。

  7. 这颗树的根节点不一样,也不是二叉树。

  8. 将u这颗树的左节点添加进队列

  9. 将v这棵树的右节点添加进队列。(因为队列先进先出,它两也是先出来)

  10. 将u这颗树的右节点添加进队列

  11. 将v这棵树的左节点添加进队列

 /**
     * 迭代  对称是指对应数值相对,不仅是结构相对
     * @param root
     * @return
     */
    public static 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;
    }

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️