• 【剑指offer61 序列化二叉树】


    题目描述

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

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

    例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
     
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    
    class Solution {
    private:
    TreeNode* decode(char * &str) {//str需要实时改变  加上&
            if(*str=='#'){
                str++;
                return NULL;
            }
            int num = 0;
            //这个数可能是几百  不是个位数
            while(*str != ',')
                num = num*10 + (*(str++)-'0');
            str++;
            TreeNode *root = new TreeNode(num);
            root->left = decode(str);
            root->right = decode(str);
            return root;
        }
    public:
        char* Serialize(TreeNode *root) {    
            if(!root) return "#"; //空的标志
            string r = to_string(root->val);
            r.push_back(','); //每个点后面用,分割
            char *left = Serialize(root->left);
            char *right = Serialize(root->right);
            char *ret = new char[strlen(left) + strlen(right) + r.size()];
            strcpy(ret, r.c_str());
            strcat(ret, left); //接尾上
            strcat(ret, right);
            return ret;
        }
        TreeNode* Deserialize(char *str) {
            return decode(str);
        }
    };
  • 相关阅读:
    java_监控工具jvisualvm
    bzoj3667: Rabin-Miller算法
    bzoj3677: [Apio2014]连珠线
    4070: [Apio2015]雅加达的摩天楼
    4069: [Apio2015]巴厘岛的雕塑
    4071: [Apio2015]巴邻旁之桥
    bzoj2653: middle
    1500: [NOI2005]维修数列
    bzoj4262: Sum
    bzoj4540: [Hnoi2016]序列
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13137742.html
Copyright © 2020-2023  润新知