问题描述

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

示例: 

你可以将以下二叉树:

    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. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  2. 19.CSS3

    前端三要素: HTML (结构)+ CSS(表现)+ JavaScript (行为) 一.什么是 CSS 1. CSS 是什么 CSS :Cascading Style Sheets ,层叠(级联)样 ...

  3. GDAL重投影重采样像元配准对齐

    研究通常会涉及到多源数据,需要进行基于像元的运算,在此之前需要对数据进行地理配准.空间配准.重采样等操作.那么当不同来源,不同分辨率的数据重采样为同一空间分辨率之后,各个像元不一一对应,有偏移该怎么办 ...

  4. CF177A1/A2 Good Matrix Elements 题解

    Content 给定一个 \(n\times n\) 的矩阵,每个元素都有一个值,求出处于两条对角线以及中间行和中间列的元素之和. 数据范围:\(1\leqslant n\leqslant 5(\te ...

  5. jQuery Validate表单验证判断是否验证通过

    只判断某个字段是否验证通过,可以参考:https://www.cnblogs.com/pxblog/p/13801171.html <form action="" metho ...

  6. 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...

  7. 【九度OJ】题目1175:打牌 解题报告

    [九度OJ]题目1175:打牌 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1175 题目描述: 牌只有1到9,手里拿着已经排好序的 ...

  8. 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)

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

  9. D. Water Tree

    D. Water Tree time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...

  10. 【python】QT5 cvimg 转 pixmap

    自己乱搞了一个 import cv2 from PIL import Image imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im = Image. ...