题目:

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

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

分析:

这道题会先调序列化函数,然后再根据序列化生成的结果调用反序列化函数,最后和原始输入来对比,所以使用哪种遍历方式都可以,在这里我们使用前序遍历,因为这样序列化得到的结果,最开始就是树的根节点。

C++使用vector来存储节点的值,空指针使用0xFFFFFFFF来表示,在反序列化时遇到0xFFFFFFFF,就可以直接跳过了。

程序:

C++

class Solution {
public:
char* Serialize(TreeNode *root) {
Dlr(root);
int *res = new int[a.size()];
for(int i = 0;i < a.size(); i++)
res[i] = a[i];
return (char*)res;
}
TreeNode* Deserialize(char *str) {
int *p = (int*) str;
return helper(p);
}
TreeNode* helper(int *&str) {
if(*str == 0xFFFFFFFF){
str++;
return nullptr;
}
TreeNode* res = new TreeNode(*str);
str++;
res->left = helper(str);
res->right = helper(str);
return res;
}
void Dlr(TreeNode *root){
if(root == nullptr){
a.push_back(0xFFFFFFFF);
return;
}
a.push_back(root->val);
Dlr(root->left);
Dlr(root->right);
}
private:
vector<int> a;
};

Java

public class Solution {
String Serialize(TreeNode root) {
if(root == null)
return "";
StringBuilder sb = new StringBuilder();
SerializeHelper(root);
return string.toString();
}
void SerializeHelper(TreeNode root) {
if(root == null) {
string.append("#,");
return;
}
string.append(root.val);
string.append(',');
SerializeHelper(root.left);
SerializeHelper(root.right);
}
TreeNode Deserialize(String str) {
if(str.length() == 0)
return null;
String[] strs = str.split(",");
return DeserializeHelper(strs);
}
TreeNode DeserializeHelper(String[] strs) {
if(strs[index].equals("#")){
index++;
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(strs[index]));
index++;
root.left = DeserializeHelper(strs);
root.right = DeserializeHelper(strs);
return root;
}
private StringBuilder string = new StringBuilder();
private int index = 0;
}

剑指Offer-61.序列化二叉树(C++/Java)的更多相关文章

  1. 剑指Offer 61. 序列化二叉树 (二叉树)

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目地址 https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 ...

  2. [剑指Offer] 61.序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r ...

  3. 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历

    剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...

  4. 力扣 - 剑指 Offer 37. 序列化二叉树

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...

  5. 【剑指Offer】序列化二叉树 解题报告(Python)

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

  6. 【Java】 剑指offer(37) 序列化二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...

  7. Go语言实现:【剑指offer】序列化二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...

  8. 剑指offer:序列化二叉树

    题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 思路分析: 这里一开始有点不明白题目的意思.实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式.而反序列就是将之前生成的序 ...

  9. 每日一题 - 剑指 Offer 37. 序列化二叉树

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag:序列化 二叉树 队列 难易程度:中等 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 1 / \ 2 ...

  10. 剑指offer——31序列化二叉树

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

随机推荐

  1. 动态尺寸模型优化实践之Shape Constraint IR Part II

    简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考.本次分享的是我们最近开展的有关shape constraint IR的工作,Part II 中我们将 ...

  2. [PHP] 业务逻辑大内存占用的优化思路, yield 和 chunk

      示例: header("content-type:text/html;charset=utf-8"); function readTxt() { $handle = fopen ...

  3. [ELK] 生产环境中 Elasticsearch 的重要配置项

    配置 Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要的 E ...

  4. dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本

    在 .NET Framework 时代里面,有一组有趣的概念,那就是 SDK 和 Runtime 这两个概念.开发模式十分有趣,在开发者设备上,可以指定 .NET Framework 的 SDK 版本 ...

  5. 安装petalinux

    1.petalinux工具下载,下载地址: https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloa ...

  6. EFK+logstash构建日志收集平台

    一.环境 k8s集群: 控制节点:192.168.199.131  主机名:master  配置:4核6G 工作节点:192.168.199.128  主机名:monitor 配置:4核4G 1.1 ...

  7. Zookeeper中的角色

    在zookeeper集群中,节点也有不同的角色,承担着不同角色. zookeeper有三种角色: 老大:Leader   (领导者)   : 客户端提供读服务和写服务. 老二:Follower(跟随者 ...

  8. 一键自动化博客发布工具,chrome和firfox详细配置

    blog-auto-publishing-tools博客自动发布工具现在已经可以同时支持chrome和firefox了. 很多小伙伴可能对于如何进行配置和启动不是很了解,今天带给大家一个详细的保姆教程 ...

  9. python教程6.4-json序列化

    序列化:dumps,编码,将python类型转成json对象 反序列化:loads,解码,将json对象转成python对象 pickle 模块提供了四个功能:dumps.loads.dump.loa ...

  10. leaflet 使用高德地图实例

    let map = L.map("mapid", { minZoom: 10, maxZoom: 15, center: [37.005646, 114.52044], zoom: ...