首页 > 其他 > 详细

101. 对称二叉树

时间:2021-04-08 15:13:31      阅读:17      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 

 老规矩,使用队列辅助完成广度优先遍历操作。

从根节点开始将左右孩子压入队列。

然后不停的从队列出去首2位元素(left,right)进行比较,

如相等,再将left节点的left节点与right节点的right节点。

这里有点绕人,需要结合图片理解

技术分享图片

 

 

在比较完根节点的2个子孩子2和2后,根据镜像的性质,后续要比较的应该是

最左边的3和最右边的3,以此类推。

时间O(n)(每个元素都需要遍历一遍),空间O(n)(完全二叉树情况下叶子节点占n/2)

    public boolean isSymmetric(TreeNode root) {
        if (root==null || (root.left==null && root.right==null))  return true;
        Deque<TreeNode> queue = new LinkedList<TreeNode>();
        // 从根节点的左右孩子处开始比较
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()){
            // 依次取出队首的2个元素(这里的left与right并不一定拥有同一个父节点)
            // 这里需要结合下文的add操作理解
            TreeNode left = queue.poll();
            TreeNode right = queue.poll();
            // 左右孩子都为空,则直接进入一下次比较
            if (left==null && right==null) continue;
            // 在上一次判断的基础上,左右孩子只有一个为空,必然存在左右孩子不等
            if (left==null || right==null) return false;
            if (left.val!=right.val) return false;
            // 注意进入队列的顺序,由于题目要求的对称性质,所以要先将
            // 最左边的元素与最右边的元素压入队列,然后是次左次右
            queue.add(left.left);
            queue.add(right.right);
            queue.add(left.right);
            queue.add(right.left);
        }
        return true;
    }

 

101. 对称二叉树

原文:https://www.cnblogs.com/jchen104/p/14631479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!