101. 对称二叉树

 

 

 

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

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

然后不停的从队列出去首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;
    }

 

posted @ 2021-04-08 11:39  jchen104  阅读(43)  评论(0编辑  收藏  举报