问题描述

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

示例: 

你可以将以下二叉树:

    1
/ \
2 3
/ \
4 5 序列化为 "[1,2,3,null,null,4,5]"

代码

这种方法使用了二叉树的层序遍历,第二部分相当于把一个层序遍历的数组重新转化为一个二叉树,构造一个虚拟的节点ans,ans->right指向根节点,也就是要返回的答案,使用left来判断应该添加在根节点的哪一个子节点上。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public: // Encodes a tree to a single string.
string serialize(TreeNode* root) {
string ans;
if(!root)return ans;
queue<TreeNode*> q;
TreeNode * node;
int size;
q.push(root);
while(!q.empty())
{
size = q.size();
for(int i = 0; i < size; ++i)
{
node = q.front();
q.pop();
if(node){
ans += to_string(node->val) + ',';
q.push(node->left);
q.push(node->right);
}
else{
ans += "null,";
}
}
}
if(!ans.size())ans.pop_back();
return ans;
} // Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
unique_ptr<TreeNode> ans(new TreeNode(0));
queue<TreeNode*> q;
q.push(ans.get());
int beg = 0,end = 0;
string s;
bool left = false;
while(beg < data.size())
{
while(end < data.size() && data[end] != ',')++end;
s = data.substr(beg,end-beg);
TreeNode* t = NULL;
if(s != "null")t = new TreeNode(atoi(s.c_str()));
auto cur = q.front();
if(left){
cur->left = t;
}
else{
cur->right = t;
q.pop();//添加完当前节点的右子节点后可以考虑队列中其他节点了
}
if(t)q.push(t);
left = !left;
beg = ++end;
}
return ans->right;
}
}; // Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

结果

执行用时 :72 ms, 在所有 C++ 提交中击败了43.30%的用户
内存消耗 :29.7 MB, 在所有 C++ 提交中击败了100.00%的用户

也可以使用递归的方法来求解。

《剑指offer》面试题37. 序列化二叉树的更多相关文章

  1. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  2. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  3. 剑指offer面试题6 重建二叉树(c)

  4. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

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

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

  6. 剑指offer——面试题8:二叉树的下一个节点

    // 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

  7. 【剑指Offer】62、序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序. ...

  8. 【剑指Offer】61、序列化二叉树

      题目描述:   请实现两个函数,分别用来序列化和反序列化二叉树.   解题思路:   序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程.反序列化是指将字节流转回结构 ...

  9. 剑指offer六十一之序列化二叉树(待补充)

    一.题目 请实现两个函数,分别用来序列化和反序列化二叉树二.思路 三.代码 --------------------------------------------- 参考链接:

  10. 剑指Offer面试题:18.二叉树的镜像

    一.题目:二叉树的镜像 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像.例如下图所示,左图是原二叉树,而右图则是该二叉树的镜像. 该二叉树节点的定义如下,采用C#语言描述: public c ...

随机推荐

  1. Linux 三剑客之sed

    目录 Linux 三剑客之sed 命令补充: sort命令 uniq命令 cut命令 tr命令 wc命令 三剑客 - sed 编辑模式: 定位分类: 实例如下: d模式--删除模式 p模式--打印 a ...

  2. 这样学习ZooKeeper离大厂所需技能要求还远吗

    概述 定义 Apache ZooKeeper是一种用于构建分布式应用的高性能.高度可靠.开源的分布式协调服务,提供如配置信息维护.命名.分布式同步.组服务等功能,可以实现如分布式共识.组管理.领导选举 ...

  3. Solon,一个轻量级的应用开发框架。发布官网喽!!!

    官网发布: https://solon.noear.org/ 项目简介: Solon,是一个轻量级的应用开发框架.更快.更小.更自由! 支持JDK8+:主框架0.1Mb:组合不同的插件应对不同需求:方 ...

  4. Windows系统CMD命令bat脚本编写

    复制文件(/y 表示不提示确认框,/-y 表示提示是否覆盖确认) echo "复制文件" copy /y D:\apache-zookeeper-3.6.3.tar.gz E:\l ...

  5. git 添加.gitignore文件不生效

    git rm -r --cached . #新增的忽略文件没有生效,是因为git是有缓存的,而之前的文件在缓存中,并不会清除掉,还会继续提交,所以更新.gitignore文件,要清除缓存文件 git ...

  6. 十行代码搭建基于.NET6三维应用程序

    本文介绍在.NET6环境下如何集成Rapid SDK三维控件,请首先确保已经安装了Vistual Studio 2022,社区版就够用了. 1 创建项目 选择创建Windows窗体应用 给程序起一个酷 ...

  7. 【LeetCode】94. Binary Tree Inorder Traversal 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 递归 迭代 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode】165. Compare Version Numbers 解题报告(Python)

    [LeetCode]165. Compare Version Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  9. Sum(hdu4407)

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. 小程序中使用、H5、uniapp下使用阿里巴巴iconfront图标或者新增图标

    第一步:登录iconfont的账号,创建项目. 第二步:选择自己需要的图标,并添加入库(就是那个购物车的图标). 第三步:将选好的图片添加到项目.(点击上图中右上角的购物车图标). 第四步:下载资源到 ...