57对称的二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
 
思路:分为递归和迭代版本。
递归版本,这道题要理解题目意思,是左子树的左节点等于右子树的右节点才是对称的,自己写成了左子树的左节点和右节点是否相等了,需要一个递归的helper函数。比较的时候只比较返回false的情况就可以了。
1)只有一个为空;
2)两者不为空,但是两者值不相等。
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool helper(TreeNode *Left,TreeNode *Right){
        if(Left == nullptr && Right== nullptr){
            return  true;
        }
        else if(Left == nullptr || Right == nullptr){
            return false;
        }
        else if(Left->val != Right->val){
            return  false;
        }
        return helper(Left->left,Right->right) && helper(Left->right,Right->left);
    }
    bool isSymmetrical(TreeNode* pRoot){
        if(pRoot == nullptr){
            return true;
        }   
        return helper(pRoot->left,pRoot->right);
    }
 
};

 

循环版本:
使用一个栈,分别将左子树的左节点和右子树的右节点压入stack,然后将左子树的右节点和右子树的左节点压入栈。每次循环弹出两个元素看是否相等,是否为空的上面的判断。一定要注意两个都为空的时候要continue,后面压栈的时候需要访问左右节点。不continue的会访问空节点。
/*
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 == nullptr){
            return true;
        }
        stack<TreeNode*> s;
        TreeNode *p,*q;
        p = pRoot -> left;
        q = pRoot -> right;
        s.push(p),s.push(q);
        while(s.size() != 0){
            p = s.top(),s.pop();
            q = s.top(),s.pop();
            if(p == nullptr && q == nullptr){
                continue;
            }
            if(p == nullptr || q == nullptr){
                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;
    }

};

 

 

 
posted @ 2018-01-17 19:05  zqlucky  阅读(167)  评论(0编辑  收藏  举报