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++核心代码

 /*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) { if(root == nullptr){
return "#";
} string s = to_string(root->val);
s.push_back(',');
char *left = Serialize(root->left);
char *right = Serialize(root->right);
char *ret = new char[strlen(left) + strlen(right) + s.size()];
strcpy(ret,s.c_str());
strcat(ret,left);
strcat(ret,right);
return ret;
}
// 注意参数类型应该为char *&str
TreeNode* Deserialize(char *&str) {
if (*str == '#'){
str ++;
return nullptr;
}
int num = ;
while (*str!=','){
num = num * + (*(str++) - '');
}
str ++; // 跳过','
TreeNode *root = new TreeNode(num);
root->left = Deserialize(str);
root->right = Deserialize(str);
return root;
}
};
 /*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<int> buf;
void dfs1(TreeNode *root) {
if(!root) buf.push_back(0xFFFFFFFF);
else {
buf.push_back(root->val);
dfs1(root->left);
dfs1(root->right);
}
}
TreeNode* dfs2(int* &p) {
if(*p==0xFFFFFFFF) {
p++;
return NULL;
}
TreeNode* res=new TreeNode(*p);
p++;
res->left=dfs2(p);
res->right=dfs2(p);
return res;
}
char* Serialize(TreeNode *root) {
buf.clear();
dfs1(root);
int bufSize=buf.size();
int *res=new int[bufSize];
for(int i=;i<bufSize;i++) res[i]=buf[i];
return (char*)res;
}
TreeNode* Deserialize(char *str) {
int *p=(int*)str;
return dfs2(p);
}
};

参考资料

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. 小程序中怎么引入wepy.js第三方toast组件

    1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...

  2. T-MAX组--项目冲刺(第二天)

    THE SECOND DAY 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 T-MAX组--项目冲刺(第二天) 团队名称 T-M ...

  3. JVM(一) ---JVM的数据模型

    JVM的逻辑内存模型图 [逻辑内存模型图] ----- JVM内部分区 其实JVM内部不仅仅只有栈和堆 包括 程序计数器 . Java 虚拟机栈 .本地方法栈.Java 堆.方法区等 1. 程序计数器 ...

  4. polarssl rsa & aes 加密与解密<转>

    上周折腾加密与解密,用了openssl, crypto++, polarssl, cyassl, 说起真的让人很沮丧,只有openssl & polarssl两个库的RSA & AES ...

  5. useMemo优化React Hooks程序性能(九)

    useMemo主要用来解决使用React hooks产生的无用渲染的性能问题.使用function的形式来声明组件,失去了shouldCompnentUpdate(在组件更新之前)这个生命周期,也就是 ...

  6. Git: git tag 使用小结(给发布版本打标记,切换并修改某个历史版本)

    通常在软件发布的时候会打一个tag,用于标注这次发布的相关信息, 这样做的好处是,将来如果这个版本出现了问题,可以通过tag迅速定位到当前版本,进行错误修复. 1. 新建tag $ git tag v ...

  7. [转]EXCEL截取字符串中某几位的函数——LeftMIDRight及Find函数的使用

    原文地址:http://blog.sina.com.cn/s/blog_3f136a180102ymq5.html EXCEL截取字符串中某几位的函数 ——Left MID Right及Find函数的 ...

  8. Qt连接数据库

    Qt连接数据库,参数设置 //连接数据库 bool VCManageDatabase::connectMYSQL() { //判断testConnect连接是否存在并连接 if (QSqlDataba ...

  9. Qt bug

    1.Qt5.2.1不支持QQuickwidget来承载qml 2.Qt5.12以及以上,不支持跨线程调用数据库连接 3.线程A不断产生sql语句,需要让两个数据库分别执行这个sql语句.所以在线程A中 ...

  10. 【linux】gitlab 的安装以及数据迁移

    一 .安装; 1  下载相应版本rpm包并安装 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors ...