题目描述

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

题目思路

在剑指offer中是采用的流的形式进行编写,这里将二叉树序列化为字符串,反序列化的时候将字符串反序列化为二叉树。序列化的时候用了 C++中现成的string数据结构,就不用担心空间容量的问题了。

题目代码

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <queue>
#include "TreeNode.h"
using namespace std;
/*题目描述
请实现2个函数,分别用来序列化和反序列化二叉树。*/
class SolutionSerialize
{
public:char* Serialize(TreeNode *root) {if (root == nullptr)return nullptr;string *result = new string();SerializeCore(root, *result);return (char*)(*result).data();}void SerializeCore(TreeNode *root, string &result) {if (root == nullptr)result.append("$,");else{result.append(to_string(root->val).data()).append(",");SerializeCore(root->left, result);SerializeCore(root->right, result);}}TreeNode* Deserialize(char *str) {if (str == nullptr)return nullptr;TreeNode* root = nullptr;DeserializeCore(&str, &root);return root;}void DeserializeCore(char** str,TreeNode** root){char* begin = *str;char* sperator = strchr(begin, ',');if (sperator == nullptr)return;int len = sperator - begin;char val[20] = { 0 };strncpy(val, begin, len);*str = sperator + 1;//str指针往后移动if (val[0] == '$')*root = nullptr;else{*root = new TreeNode(atoi(val));DeserializeCore(str, &(*root)->left);DeserializeCore(str, &(*root)->right);}}//分行打印void PrintFromTopToBottom2(TreeNode* root) {//vector<int> result;if (root == nullptr)return;// result;queue<TreeNode*> data;data.push(root);int toBePrinted = 1;int nextLevel = 0;while (!data.empty()){TreeNode* node = data.front();data.pop();toBePrinted--;//result.push_back(node->val);cout << node->val << " ";if (node->left != nullptr){data.push(node->left);nextLevel++;}if (node->right != nullptr){data.push(node->right);nextLevel++;}if (toBePrinted == 0){toBePrinted = nextLevel;nextLevel = 0;cout << endl;}}return;// result;}
};int main(int argc, char *argv[])
{/*52       8
1     3   6     9*/SolutionSerialize solution;TreeNode t1(5);TreeNode t2(2); t1.left = &t2;TreeNode t3(8); t1.right = &t3;TreeNode t4(1); t2.left = &t4;TreeNode t5(3); t2.right = &t5;TreeNode t6(6); t3.left = &t6;TreeNode t7(9); t3.right = &t7;char* result = solution.Serialize(&t1);cout << result << endl;TreeNode *pRoot = solution.Deserialize(result);solution.PrintFromTopToBottom2(pRoot);return 0;
}

测试验证

C/C++面试题—序列化二叉树相关推荐

  1. 【重点】剑指offer——面试题62:序列化二叉树

    剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...

  2. 剑指offer:面试题37. 序列化二叉树

    题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树. 示例:  你可以将以下二叉树: 1    / \   2   3      / \     4   5 序列化为 "[1 ...

  3. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  4. [二叉树]序列化二叉树 (剑指offer61)

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路 序列化二叉树:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串.需要注意的是,序列化二叉树的过程中,如果遇到空节点,需要以 ...

  5. 剑指 Offer 37. 序列化二叉树

    题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...

  6. 《剑指Offer》37:序列化二叉树

    题目 请实现两个函数,分别用来序列化和反序列化二叉树. 分析 我们清楚可以通过前序遍历序列和中序遍历序列创造出一棵二叉树.因此,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后在 ...

  7. 【LeetCode】剑指 Offer 37. 序列化二叉树

    [LeetCode]剑指 Offer 37. 序列化二叉树 文章目录 [LeetCode]剑指 Offer 37. 序列化二叉树 package offer;import java.util.Link ...

  8. 剑指offer(61)序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目分析 首先拿到题目时候,我先想到的是什么是序列化二叉树?序列化主要就是在前后端交互时候需要转换下,毕竟网络传输的是流式数据(二进制或者文本 ...

  9. 35-剑指 Offer 37. 序列化二叉树

    题目 请实现两个函数,分别用来序列化和反序列化二叉树. 你需要设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并 ...

最新文章

  1. 一个代理商×××条件
  2. 【PAT乙级】1054 求平均值 (20 分)
  3. 关于MySQL出现`lock wait timeout exceeded; try restarting transaction` 的解决方案
  4. php websocket 实战,一次WebSocket项目实战后总结的经验
  5. 正则表达式里转义字符_五分钟搞定正则表达式,如果没搞定,再加两分钟
  6. 安装 ZendServer-CE 可能遇到的问题
  7. linux 3d加速驱动_实时Linux,3D打印自行车,Google的“加速的移动页面”等
  8. 如何在Ubuntu-16.04 / 18.04上为 RTX 2080 Ti GPU 安装Nvidia驱动和cuda-10.0
  9. leetcode - Recover Binary Search Tree
  10. 全流程各工程类型地下水环境影响评价【一级】方法与MODFLOW Flex建模技术
  11. c语言jni调用外部函数,(转)JNI调用C函数
  12. 哪种工业仓库扫描枪适合您?
  13. 双绞线的制作T568A线序,T568B线序
  14. DA14580外设篇之GPIO中断
  15. Win7怎么设置工作组?Win7电脑设置工作组的方法
  16. volatility取证
  17. 计算机毕业设计SSM大学生健康管理系统的设计与实现【附源码数据库】
  18. Spring入门详解(一)如何配置一个简单的spring项目
  19. 一文搞懂常用的网络概念:域名、动态IP、DNS、DDNS
  20. 图片和视频编辑之旋转角度问题

热门文章

  1. Linux学习 - awk使用
  2. 服务器硬盘raid5扩容,超实用,物理服务器RAID扩容详解
  3. html用函数输出nn乘法表,第5讲 PHP编程.ppt
  4. null未定义_JS 里的数据类型 - null amp; undefined
  5. Android学习之网上商城(下)
  6. dubbo全局异常处理_详解Dubbo无法处理自定义异常及解决方案
  7. HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)
  8. Linux学习笔记-匿名和命名管道读写的相同点及不同点
  9. 某高校计算机系举办了一场,国家二级MS+OFFICE高级应用机试(操作题)-试卷25
  10. Linux 核心模块,LINUX核心及核心模块的简单介绍