zoukankan      html  css  js  c++  java
  • 【剑指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);
        }
    };
  • 相关阅读:
    shell编程介绍
    第一章作业
    jenkins介绍与操作
    gitlab介绍与操作
    github介绍与操作
    git介绍与操作
    zabbix监控tomcat与安全规范
    js-20170605-基本语法
    webstorm激活方法
    mac的一些基本设置(分享篇)
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13137742.html
Copyright © 2011-2022 走看看