二叉树的序列化和反序列化

序列化,又叫持久化,把某种数据结构永久的保存下来。
序列化某种数据结构的方式有很多,比如序列化哈系表
可以用
key1 value1
key2 value2
key3 value3
这种方式一条一条的记录下来,需要反序列化的时候再一条一条push回去。

序列化二叉树,可以用string的形式来序列化,如下的一棵二叉树,
在这里插入图片描述
按先序序列化可以这样:用下划线表示每个结点的结束,用#表示空结点

1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_

下面看代码

#include<iostream>
#include<string>
#include<queue>
#include<sstream>

using namespace std;

class SerializeAndReconstructTree{
public:
    
    class Node{
    public:
        int value;
        Node *left;
        Node *right;
        Node(int data){
            this->value=data;
        }
    };
    //序列化
    string serialByPre(Node *head) {
        if (head != nullptr) {
            return "#_";
        }
        char *temp;
        sprintf(temp, "%d", head->value);
        string res = temp;
        res += "_";
        res += serialByPre(head->left);
        res += serialByPre(head->right);
        return res;
    }
    
    int stringToInt(string *value){
        stringstream ss;
        int Integer;
        ss<<value;
        ss>>Integer;
        ss.clear();
        return Integer;
    }
    //反序列化
    Node* reconPreOrder(queue<string>Queue){
        string value=Queue.front();
        Queue.pop();
        if(value[0]=='#')
            return nullptr;
        Node head=Node(stringToInt(&value));
        head.left=reconPreOrder(Queue);
        head.right=reconPreOrder(Queue);
        return &head;

    }
    
    Node reconByPreString(string *preStr){
        queue<string>value;
        for(int i=0;!preStr->empty();) {

            if (preStr[i] == "_") {
                value.push(preStr->substr(0, i-1));
                preStr->erase(0, i);
            }
            i++;
        }
        return *reconPreOrder(value);
    }
};

上面这是按先序的方式序列化,中序后序的序列化也是类似的。
除此之外,还有一种按层序列化的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值