101. Symmetric Tree

来源:互联网 发布:保定seo胜达 编辑:程序博客网 时间:2024/05/16 17:25

正常思路:逐层查找,返回每一层结果,然后判断每一层是否对称。但是在一个例子上内存超了,头疼。只要问题在于每一层由于存储null,使得每一层的数据都是2的幂次方,层数越多,内存容易增长的过快,使得内存不足。
因此打算不再存储null,而是存储每一个数据在一层的位置。然后比较,尽量减少内存的消耗。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool layerSym(vector<TreeNode*> layer)    {        int left=0;        int right=layer.size()-1;        while(left<right)        {            if(layer[left]==NULL&&layer[right]==NULL)            {                left++;                right--;            }            else if(layer[left]!=NULL&&layer[right]!=NULL&&(layer[left]->val==layer[right]->val))            {                left++;                right--;            }            else                break;        }        if(left<right)            return false;        else            return true;    }    bool isSymmetric(TreeNode* root) {        vector<vector<TreeNode*>> result;        vector<int> state(1000,0);        if(root==NULL)            return true;        queue<TreeNode*> layer;        queue<int> depth;        layer.push(root);        depth.push(1);        state[0]=1;        while(state[depth.front()-1]!=0&&!layer.empty())        {            if(layer.front()==NULL)            {                layer.push(NULL);                depth.push(depth.front()+1);                layer.push(NULL);                depth.push(depth.front()+1);            }            else            {                layer.push(layer.front()->left);                depth.push(depth.front()+1);                layer.push(layer.front()->right);                depth.push(depth.front()+1);            }            if(result.size()<depth.front())            {                vector<TreeNode*> temp;                temp.push_back(layer.front());                result.push_back(temp);            }            else            {                result[depth.front()-1].push_back(layer.front());            }            if(layer.front()!=NULL)                state[depth.front()]=1;            layer.pop();            depth.pop();        }        for(int i=0;i<result.size();i++)        {            if(!layerSym(result[i]))                return false;        }        return true;    }};

成功AC的代码,建立了三个queue进行操作,成功率低不是没有道理的。哭。。。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool layerSym(vector<int> num,vector<int> pos, int depth)    {        if(depth==0&&num.size()==1)            return true;        else        {            if(num.size()%2!=0)                return false;            int left=0;            int right=num.size()-1;            while(left<right)            {                if((pos[left]+pos[right]-1==pow(2,depth))&&(num[left]==num[right]))                {                    left++;                    right--;                }                else                    return false;            }            return true;        }    }    bool isSymmetric(TreeNode* root) {        vector<vector<int>> numResult;        vector<vector<int>> posResult;        if(root==NULL)            return true;        queue<TreeNode*> layer;        queue<int> depth;        queue<int> pos;        layer.push(root);        depth.push(1);        pos.push(1);        while(!layer.empty())        {            if(layer.front()->left!=NULL)            {                layer.push(layer.front()->left);                depth.push(depth.front()+1);                pos.push(pos.front()*2-1);            }            if(layer.front()->right!=NULL)            {                layer.push(layer.front()->right);                depth.push(depth.front()+1);                pos.push(pos.front()*2);            }            if(numResult.size()<depth.front())            {                vector<int> temp;                temp.push_back(layer.front()->val);                numResult.push_back(temp);                vector<int> posTemp;                posTemp.push_back(pos.front());                posResult.push_back(posTemp);            }            else            {                numResult[depth.front()-1].push_back(layer.front()->val);                posResult[depth.front()-1].push_back(pos.front());            }            layer.pop();            depth.pop();            pos.pop();        }        //vector<vector<int>> numResult;        //vector<vector<int>> posResult;        /*         for(int i=0;i<numResult.size();i++)        {            cout<<"depth  "<<i+1<<endl<<endl;            for(int j=0;j<numResult[i].size();j++)                cout<<numResult[i][j]<<" "<<posResult[i][j]<<endl;        }        */        for(int i=0;i<numResult.size();i++)        {            if(!layerSym(numResult[i],posResult[i],i))                return false;        }        return true;    }};
0 0
原创粉丝点击