剑指offer 判断树是不是对称的

剑指offer 判断树是不是对称的

递归是很常见的实现方式,最简便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
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 compRoot(pRoot -> left, pRoot -> right);
    }
    //递归方法
    bool compRoot(TreeNode* lroot, TreeNode* rroot){
        if(!lroot) return (NULL == rroot);
        if(NULL == rroot) return false;
        if(lroot -> val != rroot -> val) return false;
        return (compRoot(lroot -> left, rroot -> right) && compRoot(lroot -> right, rroot -> left));
    }
 
 
};

迭代版本
使用栈stack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
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;
        stack<TreeNode *> s;
        s.push(pRoot->left);
        s.push(pRoot->right);
        while(!s.empty()){
            auto p=s.top();s.pop();
            auto q=s.top();s.pop();
            if(!p && !q)continue; //p,q都是NULL,则继续
            if(!p || !q)return false; // p,q中有一个是null,另一个不是,false
            if(p->val !=q->val)return false; // p,q都不是null,但是值不相等,false
             
            s.push(p->left);
            s.push(q->right);
             
            s.push(p->right);
            s.push(q->left);               
        }       
        return true;
    }
};








posted @ 2016-03-16 20:55  copperface  阅读(140)  评论(0编辑  收藏  举报