剑指offer面试题[59]-对称的二叉树

来源:互联网 发布:java连接sqlserver代码 编辑:程序博客网 时间:2024/05/19 00:40

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
/*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;        TreeNode* p1=pRoot;        TreeNode* p2=pRoot;        PreSymmetrical(p1);            //标准的前序遍历,先遍历左子树,再根结点,最后遍历右子树        DefineSymmetrical(p2);         //自定义的对称前序遍历,先遍历右子树,再根结点,最后遍历        for(int i=0;i<vec1.size();i++) //左子树注意一些特殊情况,比如所有的元素都是相同的,两种          {                            //遍历结果可能是一样的,事实上是非对阵的(比如奇数个相同              if(vec1[i]!=vec2[i])     //的值明显不是对阵的,但两种遍历结果相同),因此我们将所                  return false;        //有的结点的左右结点为空时记为NULL。          }        return true;    }   void PreSymmetrical(TreeNode*p1)     {       if(p1==NULL)           {             vec1.push_back(0);              return;           }       vec1.push_back(p1->val);       PreSymmetrical(p1->left);       PreSymmetrical(p1->right);     }   void DefineSymmetrical(TreeNode*p2)     {       if(p2==NULL)           {             vec2.push_back(0);              return;           }       vec2.push_back(p2->val);       DefineSymmetrical(p2->right);       DefineSymmetrical(p2->left);     }private:    vector<int> vec1,vec2;    //vec1和vec2分别用来存储前序遍历和自定义对称前序遍历的结果};


原创粉丝点击