对称的二叉树

文章目录

题目描述

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

/*
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)
    {
        
    }
}

思路

我们知道二叉树的深度优先遍历的方式有三种:前序遍历(root->left->right)、中序遍历(left->root->right)、后序遍历(left->right-root),对于镜像二叉树来说,如果从中间画一个对称轴,实际上左右两边的节点是一样的,换个角度来说,就是刚好两边的遍历是反着的,如果我们采用前序遍历的方式遍历,那么反向的前序遍历和前序遍历的结果一样

对称的二叉树

如上图可知,如果我们能够构建出一个反向的对称的前序遍历方式,将其遍历结果与前序遍历的结果比较是否相等,那么就可以判断该二叉树是否是镜像的了

  boolean isSymmetrical(TreeNode pRoot) {
        return isSymmetrical(pRoot, pRoot);
    }

    boolean isSymmetrical(TreeNode root1,TreeNode root2){
        if(root1 == null && root2 ==  null) return true;
        if(root1 == null || root2 == null) return false;
        if(root1.val != root2.val) return false;

        return isSymmetrical(root1.left, root2.right) && isSymmetrical(root1.right,root2.left);
    }

总结

从根节点开始,分别用前序遍历和对称前序遍历的方式进行遍历,同时还需要考虑到空节点的问题(两个都为空节点或者其中一个为空节点),本文采用的是前序遍历,先比较根节点的情况,再分别对左右节点分别进行比较

参考

《剑指offer纪念版》

上一篇:第8章 不相交集类


下一篇:【递归】【二叉数】树的子结构