牛客网剑指Offer——对称的二叉树

题目描述

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

例如下图中第一个树是对称的,而第二个不是。


解题思路

1、二叉树的镜像:

二叉树的镜像定义:源二叉树 
    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5

二叉树的镜像问题可以查看剑指offer——二叉树的镜像

2、本题解法:

  • 通过观察可以得出,判断一棵二叉树本身是否是镜像对称的,这个问题可以转化为:二叉树的左子树与右子树是否是镜像对称的。
  • 则上述问题可以通过递归实现:判断当前两个树root1、root2的值是否相等,如果不相等,则返回false;如果相等,则继续判断并且root1的左子树与root2的右子树是否为镜像对称的,root1的右子树与root2的左子树是否为镜像对称的。
  • 递归出口:当root1、root2都为NULL时,返回true。

代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if( pRoot == NULL )
            return true;
        return isMirror( pRoot->left, pRoot->right );
    }
    
    bool isMirror( 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 isMirror( root1->left, root2->right ) && isMirror( root1->right, root2->left );
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36132127/article/details/80186273