欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对称的二叉树

程序员文章站 2022-07-14 18:05:57
...

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:最近一直在用队列,不假思索直接上

/*
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;
         deque<TreeNode*> s;//双端队列
        s.push_front(pRoot);
        while(!s.empty())
        {
            if(s.size()==1)//根节点单独拎出来
            {
                TreeNode* t = s.front();s.pop_front();
                if(t->left)s.push_back(t->left);//这里考虑左右子树存在的情况下才压入队列中,跟下面的情况有点不同,
                //下面是父节点存在的情况下,就把左右子树压入队列,这是因为考虑空间结构对称
                if(t->right)s.push_back(t->right);
                continue;
            }
            int size = s.size();
            int count = 0;
            //if(size%2==1) return false;
            vector<TreeNode*> temp(size);
            for(int i = 0;i<size;i++)
            {
                temp[i]=s[i];
            }
            while(count<size/2)//前后对比
            {
                TreeNode* t = s.front();s.pop_front();
                TreeNode* d = s.back();s.pop_back();
                if(t!=NULL&&d!=NULL&&t->val==d->val)//都不为null且值相等
                {
                }
                else if(t==NULL&&d==NULL)//都为NULL
                {
                }
                else 
                {
                    return false;
                }
                count++;
            }
            count = 0;
            while(count<size)
            {
                if(temp[count])s.push_back(temp[count]->left),s.push_back(temp[count]->right);//父节点存在,就把左右子树压入队列
                count++;
            }
        }
        return true;
    }
};

后来想了想,可以去掉辅助vector,下一版本

/*
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;
         deque<TreeNode*> s;
        s.push_front(pRoot);
        while(!s.empty())
        {
            if(s.size()==1)
            {
                TreeNode* t = s.front();s.pop_front();
                if(t->left)s.push_back(t->left);
                if(t->right)s.push_back(t->right);
                continue;
            }
            int size = s.size();
            int count = 0;
            //if(size%2==1) return false;
          //  vector<TreeNode*> temp(size);
         //   for(int i = 0;i<size;i++)
          //  {
          //      temp[i]=s[i];
          //  }
            while(count<size/2)
            {
                //TreeNode* t = s.front();s.pop_front();
                //TreeNode* d = s.back();s.pop_back();
                TreeNode* t = s[count];//通过下标访问
                TreeNode* d = s[size-1-count];
                if(t!=NULL&&d!=NULL&&t->val==d->val)
                {
                }
                else if(t==NULL&&d==NULL)
                {
                }
                else 
                {
                    return false;
                }
                count++;
            }
              count = 0;
            while(count<size)
            {
               // if(temp[count])s.push_back(temp[count]->left),s.push_back(temp[count]->right);
              //  count++;
                 TreeNode* t = s.front();s.pop_front();
                if(t) s.push_back(t->left),s.push_back(t->right);
                count++;
            }
        }
        return true;
    }
};

接着试试递归写法,思路也很简单,比较根节点的左右子树,接着递归比较左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树,就是这个思路,递归就行了,结束条件,全部符合条件返回true,否则返回false;

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right)
    {
        if(left==NULL) return right==NULL;
        if(right==NULL) return false;
        if(left->val!=right->val) return false;
        return compare(left->left,right->right)&&compare(left->right,right->left);
    }
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(pRoot==NULL) return true;
         return compare(pRoot->left,pRoot->right);
    }
};
相关标签: 二叉树