剑指Offer——对成的二叉树

1、题目描述

  请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

2、代码实现

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        //1、边界检测:空树是对称的
        if (pRoot == null) {
            return true;
        }
        //2、先求出该树的镜像树
        TreeNode root = Mirror(pRoot);
        //3、把两棵树的比较结果进行返回,两棵树相同返回true,两棵树不相同返回false
        return isSymmetrical(pRoot, root);
    }
    //这个函数就是比较给定的两棵树是否相等的
     private boolean isSymmetrical(TreeNode pRoot, TreeNode root) {
         //边界值检测:如果两棵树都为空则两棵树是一样的,如果两棵树只有其中一棵树为空,那么两棵树
         //是不对称的
        if (root == null && pRoot == null) {
            return true;
        } else if (root == null || pRoot == null) {
            return false;
        }
         //边界值检测完毕比较两棵树的根结点值是否相等,如果相等,在递归的比较两棵树的左子树和右子树是否相等
        if (root.val == pRoot.val) {
            return isSymmetrical(root.left, pRoot.left) && isSymmetrical(root.right, pRoot.right);
        }
        return false;

    }
    //这个函数的作用就是求出给定根节点对应树的镜像树
    private TreeNode Mirror(TreeNode root) {
        if (root == null) {
            return null;
        }
        //创建一个新的根节点,然后把原根节点的左子树赋值给新创建根节点的右子树
        //把原根节点的右子树赋值给新创建根节点的左子树,最后返回新创建的根节点即可
        TreeNode tempRoot = new TreeNode(root.val);
        tempRoot.left = Mirror(root.right);
        tempRoot.right = Mirror(root.left);
        return tempRoot;
    }
}

  

posted @ 2019-07-14 11:33  包子的百草园  阅读(120)  评论(0编辑  收藏  举报