1 题目描述

  请实现两个函数,分别用来序列化和反序列化二叉树
  二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
  二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

2 思路和方法

  思路1:将问题分解为左子树、根节点、右子树分别进行递归处理。序列化是从根开始的,那么对应的反序列化在根节点的先序遍历中就可以得到。用’#'表示遍历过程中的nullptr,通过先序遍历得到序列。如:0,1,3,###2,4,##5,##。反序列化:如上式,首先得到数字0,作为根节点;然后得到数字1,是根节点的左子节点,接着得到3,是1的左子节点;接着得到两个’#‘,说明3为叶子结点,左右孩子都是空。然后得到’#’,说明1的右子节点为空;接着得到2,说明0的右子节点为2;以此类推。

  思路2:先序存储记录,vector转化为整型后在()char*):int *res=new int[bufSize];   for(int i=0;i<bufSize;i++)   res[i]=buf[i];   return (char*)res;  反序列化,字符串转化为int, int *p=(int*)str;   return dfs2(p);   TreeNode* res=new TreeNode(*p);   p++;   res->left=dfs2(p);   res->right=dfs2(p);

3 C++核心代码

  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. char* Serialize(TreeNode *root) {
  14.  
  15. if(root == nullptr){
  16. return "#";
  17. }
  18.  
  19. string s = to_string(root->val);
  20. s.push_back(',');
  21. char *left = Serialize(root->left);
  22. char *right = Serialize(root->right);
  23. char *ret = new char[strlen(left) + strlen(right) + s.size()];
  24. strcpy(ret,s.c_str());
  25. strcat(ret,left);
  26. strcat(ret,right);
  27. return ret;
  28. }
  29. // 注意参数类型应该为char *&str
  30. TreeNode* Deserialize(char *&str) {
  31. if (*str == '#'){
  32. str ++;
  33. return nullptr;
  34. }
  35. int num = ;
  36. while (*str!=','){
  37. num = num * + (*(str++) - '');
  38. }
  39. str ++; // 跳过','
  40. TreeNode *root = new TreeNode(num);
  41. root->left = Deserialize(str);
  42. root->right = Deserialize(str);
  43. return root;
  44. }
  45. };
  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. vector<int> buf;
  14. void dfs1(TreeNode *root) {
  15. if(!root) buf.push_back(0xFFFFFFFF);
  16. else {
  17. buf.push_back(root->val);
  18. dfs1(root->left);
  19. dfs1(root->right);
  20. }
  21. }
  22. TreeNode* dfs2(int* &p) {
  23. if(*p==0xFFFFFFFF) {
  24. p++;
  25. return NULL;
  26. }
  27. TreeNode* res=new TreeNode(*p);
  28. p++;
  29. res->left=dfs2(p);
  30. res->right=dfs2(p);
  31. return res;
  32. }
  33. char* Serialize(TreeNode *root) {
  34. buf.clear();
  35. dfs1(root);
  36. int bufSize=buf.size();
  37. int *res=new int[bufSize];
  38. for(int i=;i<bufSize;i++) res[i]=buf[i];
  39. return (char*)res;
  40. }
  41. TreeNode* Deserialize(char *str) {
  42. int *p=(int*)str;
  43. return dfs2(p);
  44. }
  45. };

参考资料

https://blog.csdn.net/zjwreal/article/details/89288722

https://blog.csdn.net/u012477435/article/details/83351659#_1782

剑指offer61:序列化二叉树的更多相关文章

  1. 剑指Offer——序列化二叉树

    题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 分析: 先序遍历可以用来序列化二叉树,序列化过程中,我们用“0xFFFFFFFF”表示结点为NULL. 反序列化便很简单,遇到“0xFFFF ...

  2. 《剑指offer》 二叉树的镜像

    本题来自<剑指offer>二叉树的镜像 题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 ...

  3. 剑指Offer:二叉树打印成多行【23】

    剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.uti ...

  4. 剑指Offer:二叉树中和为某一值的路径【34】

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

  5. 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径

    剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...

  6. 剑指 Offer 34. 二叉树中和为某一值的路径

    剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...

  7. 力扣 - 剑指 Offer 27. 二叉树的镜像

    题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换.就相当于后续遍历而已 记得要先保存下来node.right节点,因为 ...

  8. 【剑指Offer】二叉树的镜像 解题报告(Python)

    [剑指Offer]二叉树的镜像 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  9. 【剑指Offer】二叉树中和为某一值的路径 解题报告(Python)

    [剑指Offer]二叉树中和为某一值的路径 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  10. 【剑指Offer】二叉树的下一个结点 解题报告(Python)

    [剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

随机推荐

  1. kubernetes 1.14安装部署EFK日志收集系统

    简单介绍: EFK 组合插件是k8s项目的一个日志解决方案,它包括三个组件:Elasticsearch, Fluentd, Kibana.相对于ELK这样的架构,k8s官方推行了EFK,可能Fluen ...

  2. im6q中的: pad csi

    pad 管脚 pad control: 管脚控制 csi:CMOS serial interface, 即和CMOS摄像头的通信接口. imx 芯片的非常好的在线资料: https://www.dig ...

  3. Spring 中开启Mybatis缓存

    mybatis的一级缓存默认是开启的,二级缓存开启的方法: 在每个Mapper.xml文件中加入一个

  4. CMU Database Systems - Parallel Execution

    并发执行,主要为了增大吞吐,降低延迟,提高数据库的可用性 先区分一组概念,parallel和distributed的区别 总的来说,parallel是指在物理上很近的节点,比如本机的多个线程或进程,不 ...

  5. The Practical Importance of Feature Selection(变量筛选重要性)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  6. iptables 配置场景3

    iptables -I INPUT -i lo -j ACCEPT    #允许本地回环地址访问: iptables -I INPUT -m state --state ESTABLISHED,REL ...

  7. Error-JavaScript-SCRIPT5007: 无法获取未定义或 null 引用的属性“style”

    ylbtech-Error-JavaScript-SCRIPT5007: 无法获取未定义或 null 引用的属性“style” 1.返回顶部 - document.getElementById(&qu ...

  8. 修改jar包内容并打包上传到私服

    第一步:拉下git分支中代码,进行修改,修改后commit——>push 第二步:在IDEA中Terminal中执行命令进行打包到本地mvn clean package 第三步:上传到私服,方法 ...

  9. Qt5.10使用了qml后打包发布应用遇到的问题

    现象: 按照https://www.cnblogs.com/judes/p/11247728.html的方法,能生成一些exe所需环境和动态库,但是打开程序,用到了qml的地方,全是黑色的. 原因: ...

  10. javaselenium遇到的问题和解决方法(还没试,遇到问题可以先看这里)

    Firefox路径问题 firefox火狐浏览器去完成自动化测试时,代码报了如下错误: Cannot find firefox binary in PATH. mark sure firefox is ...