对称的二叉树

来源:互联网 发布:中国大学生网络党课 编辑:程序博客网 时间:2024/06/05 07:08

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

/*思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同
* 左子树的右子树和右子树的左子树相同即可,采用递归
* 非递归也可,采用栈或队列存取各级子树根节点
方法一:递归

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

方法二:循环,利用队列存储

class Solution {public:    bool isSymmetrical(TreeNode* pRoot)    {        if(root==NULL) return true;        queue<TreeNode*> q1,q2;        TreeNode *left,*right;        q1.push(root->left);        q2.push(root->right);        while(!q1.empty() and !q2.empty())        {            left = q1.front();            q1.pop();            right = q2.front();            q2.pop();            //两边都是空            if(NULL==left && NULL==right)                continue;            //只有一边是空            if(NULL==left||NULL==right)                return false;             if (left->val != right->val)                return false;            q1.push(left->left);            q1.push(left->right);            q2.push(right->right);            q2.push(right->left);        }                 return true;    }};





原创粉丝点击