劍指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 );
    }
};
發佈了52 篇原創文章 · 獲贊 54 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章