题解 | #序列化二叉树#

序列化二叉树

https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

知识点挺多的还,

动态数组、层次遍历时区分空与非空节点,字符串的特性


#include <cstdint>
class Solution {
public:
    char* Serialize(TreeNode *root) {    
        deque<TreeNode*> workQueue={root};
        TreeNode* cur;
        vector<string> preResult;
        uint_fast32_t count=0,layerSize=1,nextLayerSize=0;
        while(workQueue.size()){
            cur=workQueue.back();
            workQueue.pop_back();
            preResult.push_back((cur?to_string(cur->val):"#")+",");
            count+=preResult.back().size();

            if(cur){
			  	layerSize--;
                if(cur->left){
                    workQueue.push_front(cur->left);nextLayerSize++;
                }else{workQueue.push_front(nullptr);}
                if(cur->right){
                    workQueue.push_front(cur->right);nextLayerSize++;
                }else{workQueue.push_front(nullptr);}
            }
            if(layerSize==0){
                layerSize=nextLayerSize;
            }
        } 
        
   
        char *result=new char[count];
        count=0;
        for(auto &s:preResult){
            for(auto &si:s){
                result[count]=si;
                count++;
            }
        }



        return result;
    }
    TreeNode* Deserialize(char *str) {
        char *cur=str;
        string curNum;
        TreeNode *beforeResult=new TreeNode(1),*curNode,*workNode;
        deque<TreeNode*> workQueue={beforeResult};
        bool left=false;
        

        while((*cur)!='\0'&&workQueue.size()){
            //cout<<cur<<endl;
            if(*cur==','){
                if(curNum=="#"){
                    workNode=nullptr;
                 }else{
                    workNode=new TreeNode(stoi(curNum));
                }
               curNode=workQueue.back();
                if(left){
                    curNode->left=workNode;
                }else{
                    curNode->right=workNode;
                    workQueue.pop_back();
                }
                left=!left;
                if(workNode)workQueue.push_front(workNode);
                curNum="";

            }else{
                curNum+=*cur;
            }
            cur++;

        }
        delete [] str;
        cout<<endl;
        return beforeResult->right;

    
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务