2020-03-08[剑指offer-]序列化二叉树

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
#include <string.h>
class Solution {
public:
    
    string func1(TreeNode *root) {    
        string str("");
        if(root == NULL)
        {
            str = "#!";
            return str;
        }
        
        stringstream ss;
        ss.imbue(std::locale("C"));
        string tValue("");
        
        ss<<root->val;
        ss>>tValue;
        
        tValue += "!";        
        tValue += func1(root->left);
        tValue += func1(root->right);
        
        return tValue;
    }
    
    char* Serialize(TreeNode *root) {    
        string str = func1(root);
        size_t tlength = str.length();
        char* tmp = new char[tlength+1];
        memset(tmp,0,tlength+1);
        memcpy(tmp,str.c_str(),tlength);
        return tmp;
    }
    
    TreeNode* func2(stringstream& ss) {
        
        string tmp;
        if(getline(ss, tmp, '!'))
        {
            if(tmp == "#")
            {
                return NULL;
            }
            else
            {
                int tVal = atoi(tmp.c_str());
                TreeNode* tNode = new TreeNode(tVal);
                tNode->left = func2(ss);
                tNode->right = func2(ss);
                return tNode;
            }
        }
        return NULL;
    }
    
    TreeNode* Deserialize(char *str) {
        
        stringstream ss;
        ss << str;
        return func2(ss);
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容