• 面试题37:序列化二叉树


    输入一棵二叉树,将其序列化为char*,并且支持反序列化为二叉树。

    解题思路

    • 先序遍历二叉树,序列化
    • 同先序遍历结构,反序列化
    代码运行结果没问题,但是未通过所有测试案例。。。
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <cstring>
    #include "ListNode.h"
    #include "TreeNode.h"
    #include "Graph.h"
    using namespace std;
    
    #define MAXNUM 100010
    #define DRIFT 1001
    
    void Serialize(TreeNode* pRoot, vector<char> &vec){
        if(pRoot == nullptr){
            vec.push_back('$');
            vec.push_back(',');
            return ;
        }
        vec.push_back('0' + pRoot->val);
        vec.push_back(',');
        Serialize(pRoot->left, vec);
        Serialize(pRoot->right, vec);
    }
    
    // 序列化二叉树(前序遍历的格式)
    char* Serialize(TreeNode* root){
        vector<char> vecStr;
    
        Serialize(root, vecStr);
        char* str = new char[vecStr.size() + 1];
        int i;
        for(i = 0; i < (int)vecStr.size(); i++)
            str[i] = vecStr[i];
    
        str[i] = '';
        return str;
    }
    
    TreeNode* Deserialize(vector<char> &vec){
        if(vec.size() == 0)
            return nullptr;
    
        TreeNode* pNode = new TreeNode(vec[vec.size() - 1] - '0');
        vec.pop_back();
        vec.pop_back();
    
        // 如果读取的是数字
        if(vec[vec.size() - 1] >= '0' && vec[vec.size() - 1] <= '9')
            pNode->left = Deserialize(vec);
        else{
            pNode->left = nullptr;
            vec.pop_back();
            vec.pop_back();
        }
    
        // 如果读取的是数字
        if(vec[vec.size() - 1] >= '0' && vec[vec.size() - 1] <= '9')
            pNode->right = Deserialize(vec);
        else{
            pNode->right = nullptr;
            vec.pop_back();
            vec.pop_back();
        }
        return pNode;
    }
    
    // 根据前序遍历的序列化结果,重建二叉树
    TreeNode* Deserialize(char *str){
    
        // 根据前序遍历重建
        vector<char> vec;
        string s = str;
        for(int i = s.length() - 1, j = 0; i >= 0; i--)
            vec.push_back(s[i]);
    
        return Deserialize(vec);
    }
    
    int main()
    {
        TreeNode* pNode1 = CreateBinaryTreeNode(1);
        TreeNode* pNode2 = CreateBinaryTreeNode(2);
        TreeNode* pNode3 = CreateBinaryTreeNode(3);
        TreeNode* pNode4 = CreateBinaryTreeNode(4);
        TreeNode* pNode5 = CreateBinaryTreeNode(5);
        TreeNode* pNode6 = CreateBinaryTreeNode(6);
    
        ConnectTreeNodes(pNode2, pNode4, nullptr);
        ConnectTreeNodes(pNode3, pNode5, pNode6);
        ConnectTreeNodes(pNode1, pNode2, pNode3);
    
        // 如果写为char str[100]返回的话,会报错,不能返回局部变量
        char* str = Serialize(pNode1);
        cout<<str<<endl;
    
        PrintTree(Deserialize(str));
        delete str;
        return 0;
    }
    
  • 相关阅读:
    ZOJ4134 Unrooted Trie(dfs序+线段树)
    ZOJ4127 Grid with Arrows(欧拉路径的判断)
    CF1037E Trips(思维)
    django学习第十四天--Forms和ModelForm
    django学习第十三天--自定义中间件
    图书管理系统---基于ajax删除数据
    django学习第十二天--ajax请求和csrftoken认证的三种方式
    django中修改QueryDict数据类型和转成普通字典
    图书管理系统进阶---多表操作
    locals()用法
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13523012.html
Copyright © 2020-2023  润新知