題目描述
請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。
例如下圖中第一個樹是對稱的,而第二個不是。
解題思路
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 );
}
};