1. 程式人生 > 實用技巧 >劍指offer(五十八):對稱的二叉樹

劍指offer(五十八):對稱的二叉樹

題目描述

請實現一個函式,用來判斷一棵二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。 剛開始的思路:由於題目中說如果與其映象二叉樹相同,那麼就是對稱的,那我就先建立該二叉樹的映象二叉樹,然後比較這兩顆二叉樹是否一樣。 建立映象二叉樹,需要先建立根結點,因為根結點肯定都是一致的,然後遞迴建立當前結點的左右孩子結點,在建立時將其左右孩子交換, 比較映象二叉樹與當前二叉樹:剛開始主要是在遞迴結束條件處沒有思路,應該是兩個節點都為空返回true,有一個結點不為空就要返回false,如果兩個節點都不為空,那麼比較兩者的值,如果不相等返回false,如果相等接著向下比較。
/*
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) return true;
        TreeNode* mirrorRoot = new
TreeNode(pRoot->val); mirrorTree(pRoot,mirrorRoot); bool flag=true; isSymmetrical2(pRoot,mirrorRoot,flag); return flag; } void mirrorTree(TreeNode* pRoot,TreeNode* mirrorRoot){ if(pRoot){ TreeNode* mirrorLeft = NULL; TreeNode
* mirrorRight = NULL; if(pRoot->right){ mirrorLeft = new TreeNode(pRoot->right->val); } if(pRoot->left){ mirrorRight = new TreeNode(pRoot->left->val); } mirrorRoot->left = mirrorLeft; mirrorRoot->right = mirrorRight; mirrorTree(pRoot->left,mirrorRoot->right); mirrorTree(pRoot->right,mirrorRoot->left); } } void isSymmetrical2(TreeNode* pRoot,TreeNode* mirrorRoot,bool &flag){ if(pRoot&&!mirrorRoot || !pRoot&&mirrorRoot) flag = false; if(flag&&pRoot&&mirrorRoot){ if(pRoot->val!=mirrorRoot->val) flag = false; else flag = true; isSymmetrical2(pRoot->left,mirrorRoot->left,flag); isSymmetrical2(pRoot->right,mirrorRoot->right,flag); } } };

後來,我發現根本不需要建立映象二叉樹就可以得出結果,只需要returnisSymmetrical(pRoot->left,mirrorRoot->right)&&isSymmetrical(pRoot->right,mirrorRoot->left)左子樹節點和右子樹節點進行比較,右子樹節點和左子樹節點進行比較,這樣的話,減少了空間的使用但是增加了時間的消耗。

/*
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) return true;
        return isSymmetrical(pRoot,pRoot);
    }
   bool isSymmetrical(TreeNode* pRoot,TreeNode* mirrorRoot){
        if(!pRoot && mirrorRoot || pRoot&&!mirrorRoot)
            return false;
        if(!pRoot&&!mirrorRoot)
            return true;
        if(pRoot->val!=mirrorRoot->val)
            return false;
        return isSymmetrical(pRoot->left,mirrorRoot->right)&&isSymmetrical(pRoot->right,mirrorRoot->left);
    }
};