1. 程式人生 > >101. Symmetric Tree的C++解法

101. Symmetric Tree的C++解法

一開始陷入了一個誤區,認為【對稱樹】和【中序遍歷結果對稱】是充要條件,但其實中序遍歷結果對稱的不一定是對稱樹,如[1,2,3,3,#,2,#]。所以程式碼在lintcode上通過了但是沒在leetcode上通過。(leetcode上的測試資料設計得更好一些

其實樹的問題基本都可以使用遞迴問題,在這裡不是要判斷左子樹和右子樹是否一樣,而是判斷左子樹的左子樹和右子樹的右子樹,以及左子樹的右子樹和右子樹的左子樹是否一樣。注意別忘了判斷左子樹和右子樹的值是否相等。

class Solution {
public:
    bool isSymmetric(TreeNode * root) {
        if (root==NULL) return 1;
        return cmpTree(root->left,root->right);
    }
    bool cmpTree(TreeNode * l,TreeNode * r){
        if (l==NULL)
        {if (r==NULL) return true;
            else return false;}
        else {if (r==NULL) return false;
             else return (l->val==r->val)&&cmpTree(l->left,r->right)&&cmpTree(l->right,r->left);;}
    }
};

還有一個使用棧的非遞迴方式很巧妙。一次push或pop兩組數,比較兩組數是否相等即可。

class Solution {
public:
    bool isSymmetric (TreeNode* root) {
        if (!root) return true;
        stack<TreeNode*> s;
        s.push(root->left);
        s.push(root->right);
        while (!s.empty ()) {
            auto p = s.top (); s.pop();
            auto q = s.top (); s.pop();
            if (!p && !q) continue;
            if (!p || !q) return false;
            if (p->val != q->val) return false;
            s.push(p->left);
            s.push(q->right);
            s.push(p->right);
            s.push(q->left);
        }
        return true;
    }
};