• 剑指offer-序列化二叉树


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

    • 以前提交的内存超出了,可能现在要用非递归实现了
    #include<iostream>
    #include<math.h>
    
    #include <vector>
    #include <string>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <map>
    #include <unordered_map>
    #include <set>
    #include <unordered_set>
    
    #include <algorithm>
    #include <functional>
    #include <numeric> //accmulate
    
    #include <iterator> //ostream_iterator
    #include <fstream>
    #include <iomanip>  //setprecision() setw()
    
    #include <memory> 
    #include <cstring> //memset
    using namespace std;
    
    //#define cin infile //一定不能再oj系统中,有错,导致超时等!!!
    //C++文件输入
    ifstream infile("in.txt", ifstream::in);
    
    #include <limits>
    #define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
    #define INT_MAX       2147483647    /* maximum (signed) int value */
    
    #include <array>
    #include <bitset>
    
    // Definition for singly - linked list.
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    
    // Definition for a binary tree node.
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    
    //1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
    //不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
    //2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
    //在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会
    //随着递归的进行而移动
    class Solution_Serialize{
    public:
        void help_seri(TreeNode* root, string &res)
        {
            if (!root)
            {
                res += '#,';
                return;
            }
            //前序遍历
            //char r[10];
            //sprintf(r, "%d", root->val);
            string r = to_string(root->val);
            res += r;
            res += ',';
            help_seri(root->left, res);
            help_seri(root->right, res);
    
        }
    
        char* Serialize(TreeNode *root) {
    
            if (!root)
            {
                return nullptr;
            }
    
            string res;
    
            help_seri(root, res);
    
            return const_cast<char*>(res.c_str());
        }
    
        // 由于递归时,会不断的向后读取字符串,所以一定要用**str,以保证得到递归后指针str指向未被读取的字符
        TreeNode* help_deseri(char** str)
        {
            if (**str=='#')
            {
                (*str)++;
                return nullptr;
            }
            int num = 0;
            while (**str != ''&&**str != ',')
            {
                num = num * 10 + (**str-'0');
                ++(*str);
            }
            TreeNode* node = new TreeNode(num);
            if (**str=='')
            {
                return node;
            }
            else
            {
                ++(*str);
            }
    
            node->left = help_deseri(str);
            node->right = help_deseri(str);
    
            return node;
        }
    
        TreeNode* Deserialize(char *str) {
    
            if (str==NULL)
            {
                return nullptr;
            }
    
            TreeNode* ret = help_deseri(&str);
    
            return ret;
        }
    };
    
    
    int main()
    {
        Solution_Serialize su_1;
        char str[] = { '3', ',', '9', ',', '20', ',', ' #', '#', '15', ',', '7', ',' };
        TreeNode* ret = su_1.Deserialize(str);
        
        return 0;
    }
  • 相关阅读:
    冲刺第四天
    冲刺第三天
    冲刺第二天
    评估前冲刺第一天
    点击切换上一页,下一页
    react生命周期
    package.json入门
    nodeType的十二种类型
    ECMAScript 6 let和const命令
    JavaScript语言精粹_JSON
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9020250.html
Copyright © 2020-2023  润新知