序列化二叉树

本文介绍了如何使用深度优先搜索(DFS)实现二叉树的序列化和反序列化,通过递归构建和解析字符串,展示了从TreeNode对象到字符串编码,以及从字符串解码回原始树结构的过程。
摘要由CSDN通过智能技术生成

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

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

数据范围

树中节点数量 [0,1000]。

样例
你可以序列化如下的二叉树
    8
   / \
  12  2
     / \
    6   4

为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"

注意:

  • 以上的格式是题目序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。

em,因为过程过于复杂,so直接在代码中表示啦(作者是只是想偷懒) 

class Solution {
public:

// Encodes a tree to a single string.
string serialize(TreeNode* root) {
    string res;
    dfs_s(root, res);
    return res;
}

void dfs_s(TreeNode* root, string &res){
    if(!root) {
        res += "null ";//如果当前节点为空,保存null和一个空格
        return ;
    }
    res += to_string(root->val) + ' ';//如果当前节点不为空,保存数字和一个空格
    dfs_s(root->left, res);
    dfs_s(root->right, res);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
    int u = 0;  //用来保存当前的字符串遍历的位置
    return dfs_d(data, u);
}

TreeNode* dfs_d(string data, int &u){//这里的u是传的引用,不是值传递
    if (u == data.size()) return NULL;  //如果已经达到了字符串的尾端,则退出。
    int k = u;
    while(data[k] != ' ') k++; //k记录当前数字的位数如134是个三位数的数字,56是个两位数的数字,退出的时候,k指向了字符的中间的空格,所以回到下个字符的首部需要加1.

    if(data[u] == 'n') {//如果当前字符串是“null”
        u = k+1;//回到下一个数字的首部,注意是u = k+1, 不是u = u+1;
        return NULL;//表示这次构造的是一个null节点,并没有孩子节点,所以跳过后面的递归
    }
    int val = 0;
    //如果数字是负的
    if(data[u] == '-'){
         for (int i = u+1; i < k; i++) val = val * 10 + data[i] - '0';
         val  = -val;
    }
    else{
    //如果是数字是正的
        for (int i = u; i < k; i++) val = val * 10 + data[i] - '0';
    }
    u = k + 1;//回到下个数字的首部
    //递归算法总是先写退出条件,然后才递归调用。
    auto root = new TreeNode(val);
    root->left = dfs_d(data, u);
    root->right = dfs_d(data, u);
    return root;
}
}
;

em以上就是这些,对了如果你对STL,图,树,感兴趣可以去这个网站通过动画可视化数据结构和算法<br> - VisuAlgo(这个网站只是自己觉得好用,并无代言,接广告毕竟我只是个小学生) ,好了,以上内容如果对您有帮助的话呢也请别忘了收藏可以不要关注和赞哦,只要对您有用就行了以免您找不到本期内容,再见

                                                                                                                                 ————无语的唐桑!!!

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值