题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
例如下图中第一个树是对称的,而第二个不是。
解题思路
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 ); } };