序列化二叉树

问题:实现两个函数,序列化一个二叉树。

如果之前做过一个题目: 用一颗二叉树的中序和前序还原二叉树的话,最直观的解法是用把二叉树系列化成一个中序序列和一个前序序列,但是这个方法的缺陷是每个节点上的值不能相同,而且需要将整个序列都读入之后才能序列化,如果序列到一个流中,在从流中读出来还原二叉树效率将会比较低。


其实序列化的时候只需要前序就可以了,只是遍历到每个NULL指针的时候对应的序列化位天成一个特殊符号即可(如'#').还原的时候,直接从前往后读,靠前的是根节点,和它相邻的如果不是# 则是它的左孩子....如果碰到'#'则正证明当前指针应该是空指针,赋予空指针之后并返回到父节点处理其它分枝。下面是我实现的代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    char* Serialize(TreeNode *root){    
        string str="";
        MySerialize(root,str);
        char * result = new char[str.size()+1];
        strcpy(result,str.c_str());
        return result;
    }
    void MySerialize(TreeNode * root,string & str){
        if(root ==NULL) {
            str+='#';
            return;
        }
        char temp[10];
        sprintf(temp,"%d",root->val);
        str+= temp;
        str+=",";
        MySerialize(root->left,str);
        MySerialize(root->right,str);
    }
    TreeNode* Deserialize(char *str) {
        if(str==NULL || *str=='#') return NULL;
        int index = 0;
        return MyDeserialize(str,index);
    }
    TreeNode* MyDeserialize(char *str,int &index){
        if(str[index]=='\0') return NULL;
        if(str[index]=='#'){ index++; return NULL;}
        int cval = 0;
        while(str[index]!=','){
            cval *=10;
            cval += int(str[index]-'0');
            index++;
        }
        index++;
        TreeNode * root = new TreeNode(cval);
        root->left = MyDeserialize(str,index);
        root->right = MyDeserialize(str,index);
        return root;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值