首页 > 其他分享 >序列化二叉树

序列化二叉树

时间:2024-04-01 19:58:54浏览次数:24  
标签:序列化 val data dfs 二叉树 res null root

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

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

数据范围

树中节点数量 [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(这个网站只是自己觉得好用,并无代言,接广告毕竟我只是个小学生) ,好了,以上内容如果对您有帮助的话呢也请别忘了收藏可以不要关注和赞哦,只要对您有用就行了以免您找不到本期内容,再见

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

标签:序列化,val,data,dfs,二叉树,res,null,root
From: https://blog.csdn.net/2301_76551733/article/details/137244357

相关文章

  • php反序列化——字符逃逸增加
    题目 放到本地环境 发现是这种情况:a:2:{i:0;s:1:"x";i:1;s:5:"aaaaa";}分成两部分: a:2:{i:0;s:1:"x              ";i:1;s:5:"aaaaa";}现在需要做的就是自己构造第二部分:  ";i:1;s:6:"123456";}  一共20个字符经过preg_replace函数 ......
  • 【二叉树】Leetcode 437. 路径总和 III【中等】
    路径总和III给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1:**输入:**root=[10,5,-3,3,2,null,11,3,......
  • 2673. 使二叉树所有路径值相等的最小代价
    思路先看3节点的子树,想要路径值相同,只能修改叶子节点的值,如上图只能2去+1操作。核心思想:那么对于任意左右孩子节点,想要从根节点下来的路径相同,只能修改孩子节点。所以我们只需要从下至上记录叶子节点到当前节点的路径值,然后计算当前节点和右节点的差值。详细看灵神树上贪心......
  • [蓝桥杯 2019 省赛 AB] 完全二叉树的权值
    #[蓝桥杯2019省AB]完全二叉树的权值##题目描述给定一棵包含$N$个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是$A_1,A_2,\cdotsA_N$,如下图所示:现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有......
  • 【前端面试3+1】06继承方式及优缺点、缓存策略、url输入到渲染全过程、【二叉树中序遍
    一、继承有哪些方式?以及优缺点        继承的方式包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和组合式继承。1.原型链继承:实现方式:将子类的原型指向父类的实例来实现继承。优点:简单易懂,代码量少。缺点:存在引用类型共享的问题。functionPare......
  • 2024.2.7力扣每日一题——二叉树的堂兄弟节点2
    2024.2.7题目来源我的题解方法一哈希表+层序遍历(自己的想法,硬在每一层去算)方法二广度优先遍历(官方题解,在上一层求下一层)题目来源力扣每日一题;题序:2461我的题解方法一哈希表+层序遍历(自己的想法,硬在每一层去算)使用两个哈希表分别映射parent<子节点,父节点>,c......
  • 2024.2.8力扣每日一题——二叉树的堂兄弟节点
    2024.2.8题目来源我的题解方法一层序遍历方法二深度优先遍历题目来源力扣每日一题;题序:993我的题解方法一层序遍历使用层序遍历,先判断x或y是否是根节点,若是则x和y必然不可能是堂兄弟节点。每次遍历当前层时判断下一层是否出现x和y,若x和y分别出现在该节点的......
  • 【每周例题】力扣 C++ 二叉树的最小深度
    二叉树的最小深度题目二叉树的最小深度题目分析1.首先我们可以处理最小深度为0与最小深度为1的情况:最小深度为0:头结点为空;root==nullptr最小深度为1:root->left==nullptr&&root->right==nullptr2.接下来分为左右子树处理,我们可以用递归来计算最小深度3.最后比较左......
  • LeetCodeHot100 二叉树 94. 二叉树的中序遍历 104. 二叉树的最大深度 101. 对称二
    94.二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&envId=top-100-liked//递归//List<Integer>resList;//publicList<Integer>inorderTraversal(TreeNoderoot){//re......
  • JDBC反序列化分析
    环境依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version></dependency>原理分析Java序列化对象的标识符找两个序列化后的bin文件,进行对比,可以发现前两个字节是固定的AC, ED,变十进制就是-......