101. Symmetric Tree (Tree, Queue; DFS, WFS)

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

思路:要等到左儿子和右儿子的结果都知道了,才能判断当前节点的对称性,所以是后序遍历

法I:递归,先判断两个节点自身是否相等,如果相等再判断左、有儿子 => 前序遍历

class Solution {
public:
    bool isSymmetric(TreeNode *root) {
        if(!root) return true;
        
        bool result;
        if((root->left==NULL && root->right != NULL) ||(root->left!=NULL && root->right == NULL))
        {
            return false;
        }
        else if(root->left == NULL && root->right == NULL)
        {
            return true;
        }
        else
        {
            result = cmp(root->left, root->right);
        }      
    }
    bool cmp(TreeNode * node1, TreeNode* node2)
    {
        int result1 = true;
        int result2 = true;
        if(node1->val!=node2->val) return false;
        else
        {
            //递归结束条件:至少有一个节点为NULL
            if((node1->left==NULL && node2->right != NULL) ||
            (node1->left!=NULL && node2->right == NULL)||
            (node1->right!=NULL && node2->left == NULL)||
            (node1->right==NULL && node2->left != NULL))
            {
                return false;
            }
            if((node1->left == NULL && node2->right == NULL)&&
            (node1->right == NULL && node2->left== NULL))
            {
                return true;
            }

            //互相比较的两个点,要比较节点1的左儿子和节点2的右儿子,以及节点1的右儿子和节点2的左儿子
            if(node1->left != NULL)
            {
                result1 = cmp(node1->left,node2->right);
            }
            if(node1->right != NULL)
            {
                result2 = cmp(node1->right,node2->left);
            } 
            return (result1 && result2);
        }
    }     
};

法II:用队列实现层次遍历(层次遍历总是用队列来实现)

class Solution {
public:
    bool isSymmetric(TreeNode *root) {
        if(root == NULL)    return true;
        queue<TreeNode*> q;
        q.push(root->left);
        q.push(root->right);
        TreeNode *t1, *t2;
        while(!q.empty()){
            t1 = q.front();
            q.pop();
            t2 = q.front();
            q.pop();
            if(t1 == NULL && t2 == NULL)
                continue;
            if(t1 == NULL || t2 == NULL || t1->val != t2->val)
                return false;
            q.push(t1->left);
            q.push(t2->right);
            q.push(t1->right);
            q.push(t2->left);
        }
        return true;
    }
};

 

posted on 2015-10-04 14:11  joannae  阅读(300)  评论(0编辑  收藏  举报

导航