风也温柔

计算机科学知识库

java二叉树算法 剑指Offer(五十八):对称的二叉树(Java版)

  描述

  给定一棵二叉树,判断其是否是自身的镜像(即:是否对称

  例如: 下面这棵二叉树是对称的

  java二叉树算法_java二叉树的遍历算法_二叉树的递归遍历算法

  下面这棵二叉树不对称。

  二叉树的递归遍历算法_java二叉树算法_java二叉树的遍历算法

  数据范围:节点数满足 0 le n le 10000≤n≤1000,节点上的值满足 |val| le 1000∣val∣≤1000

  要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

  备注:

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

  示例1

  输入:{1,2,2,3,4,4,3}

  返回值:true

  java二叉树的遍历算法_二叉树的递归遍历算法_java二叉树算法

  示例2

  输入:{8,6,9,5,7,7,5}

  返回值:false

  第一种解法

  直接将树分为左子树 和 右子树java二叉树算法java二叉树算法,然后循环遍历,判断对应节点是否一致即可,代码如下

   public boolean firstIsSymmetrical(TreeNode pRoot) {

            if(pRoot == null){
                return true;
            }
           if(pRoot.left == null && pRoot.right == null){
               return true;
           }
    <p>

            if(pRoot.left == null || pRoot.right == null){
                return false;
            }
           return isSame(pRoot.left,pRoot.right);
        }
        public boolean isSame(TreeNode leftTree, TreeNode rightTree){
            if(leftTree == null && rightTree == null){
                return true;
            }
            if(leftTree != null && rightTree != null && leftTree.val == rightTree.val){
                return isSame(leftTree.left,rightTree.right) && isSame(leftTree.right,rightTree.left);
    &emsp;&emsp;![二叉树的递归遍历算法_java二叉树算法_java二叉树的遍历算法][4]

            }
            return false;

</p>
  第二种解法

  其实和第一种解法类似,但是不采用递归的方法,使用队列来实现java二叉树算法 剑指Offer(五十八):对称的二叉树(Java版),代码如下

   public boolean secondIsSymmetrical(TreeNode pRoot) {

            if(pRoot == null){
                return true;
            }
            if(pRoot.left == null && pRoot.right == null){
                return true;
            }
    <p>![二叉树的递归遍历算法_java二叉树算法_java二叉树的遍历算法][5]

            if(pRoot.left == null || pRoot.right == null){
                return false;
            }
            Queue leftTree = new LinkedList();
            Queue rightTree = new LinkedList();
            leftTree.add(pRoot.left);
            rightTree.add(pRoot.right);
            while (!leftTree.isEmpty() && !rightTree.isEmpty()){
                TreeNode left = leftTree.poll();
                TreeNode right = rightTree.poll();
                if(left == null && right == null){
                    continue;
                }
    &emsp;&emsp;![java二叉树的遍历算法_二叉树的递归遍历算法_java二叉树算法][6]

                if(left == null || right == null){
                    return false;
                }
                if(left.val != right.val){
                    return false;
                }
                leftTree.add(left.left);
                leftTree.add(left.right);
                rightTree.add(right.right);
                rightTree.add(right.left);
            }
            return leftTree.isEmpty() && rightTree.isEmpty();

</p>
  文章来源:https://www.toutiao.com/a7047774611886457357/