zoukankan      html  css  js  c++  java
  • 剑指offer:序列化二叉树

    题目描述:

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

    思路分析:

    这里一开始有点不明白题目的意思。实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式。而反序列就是将之前生成的序列转化成二叉树。

    常规的想法里面,编码二叉树无非就是前序、中序、后序或是层次,但是我们都直到前序遍历加上中序遍历才能确定一颗二叉树,所以需要引入一些额外的信息,对于空的指针有表示。

    下面的代码当中,是利用了前序遍历来序列化二叉树,其中对于空指针用‘#'表示,且每个结点后会用','隔开。注意二叉树的值为整数,可能包含多位,因此转化为二叉树时,需要将字符串转化为整型。

    代码:

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };
    10 */
    11 class Solution {
    12 public:
    13     void SerializeCore(TreeNode* root, string &str)
    14     {
    15         if(!root)
    16         {
    17             str += '#';
    18             return;
    19         }
    20         string tmp = to_string(root->val);
    21         tmp += ',';
    22         str += tmp;
    23         SerializeCore(root->left, str);
    24         SerializeCore(root->right, str);
    25     }
    26     char* Serialize(TreeNode *root) {    
    27         if(!root)
    28             return nullptr;
    29         string str;
    30         SerializeCore(root, str);
    31         int len = str.length();
    32         char* res = new char[len+1];
    33         for(int i=0; i<str.length(); i++)
    34         {
    35             res[i] = str[i];
    36         }
    37         res[len] = '';
    38         return res;
    39         
    40     }
    41     TreeNode* DeserializeCore(char **str)
    42     {
    43         if(**str == '#')
    44         {
    45             (*str)++;
    46             return nullptr;
    47         }
    48         
    49         // 这里注意的是整数用了字符串做表示,一个字符仅表示一位,因此首先要进行转化
    50         int num=0;
    51         while(**str != ',' && **str != '')
    52         {
    53             num = num*10 + ((**str) - '0');
    54             (*str)++;
    55         }
    56         TreeNode* root = new TreeNode(num);
    57         if(**str == '')
    58             return root;
    59         else
    60             (*str)++;
    61         root->left = DeserializeCore(str);
    62         root->right = DeserializeCore(str);
    63         return root;
    64     }
    65     
    66     TreeNode* Deserialize(char *str) {
    67         if(!str)
    68             return nullptr;
    69         TreeNode* res = DeserializeCore(&str);
    70         return res;
    71     }
    72 };
  • 相关阅读:
    Python基础:Python函数、文件操作、递归
    Python面向对象高级编程:__slot__(给实例添加方法、属性)
    Python fullstack系列【1】:初识Python
    Python fullstack系列【2】Python数据类型
    liunux联网方式配置
    使用 SercureSRT连接linux虚拟机
    高质量代码css部分笔记,未实验
    一段代码
    让图片算好高宽再显示
    你正在成长为一名优秀的程序员吗?
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11128927.html
Copyright © 2011-2022 走看看