二叉树的序列化和反序列化
来源:互联网 发布:mfc socket网络编程 编辑:程序博客网 时间:2024/04/28 03:03
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7}
,表示如下的树结构:
3 / \9 20 / \ 15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */class Solution {public: /** * This method will be invoked first, you should design your own algorithm * to serialize a binary tree which denote by a root node to a string which * can be easily deserialized by your own "deserialize" method later. */ string serialize(TreeNode *root) { // write your code here string temp; if (root == NULL) { return temp; } char str[10]; queue<TreeNode*> buf; buf.push(root); while (!buf.empty()) { TreeNode *front = buf.front(); if (front != NULL) { sprintf(str, "%d", front->val); temp += str; buf.push(front->left); buf.push(front->right); } else { temp += "#"; } temp += " "; buf.pop(); } int end = temp.length()-1; while (temp[end] == '#' || temp[end] == ' ') { end--; } return temp.substr(0, end+1); } /** * This method will be invoked second, the argument data is what exactly * you serialized at method "serialize", that means the data is not given by * system, it's given by your own serialize method. So the format of data is * designed by yourself, and deserialize it here as you serialize it in * "serialize" method. */ TreeNode *deserialize(string data) { // write your code here int n = data.length(); if (n < 1) { return NULL; } vector<int> pos; pos.push_back(-1); for (int i = 0; i < n; i++) { if (data[i] == ' ') { pos.push_back(i); } } if (pos.size() == 1) { return new TreeNode(atoi(data.c_str())); } pos.push_back(n); vector<TreeNode*> nodes; for (int i = 0; i < pos.size()-1; i++) { string temp = data.substr(pos[i]+1, pos[i+1]-pos[i]-1); if (temp == "#") { nodes.push_back(NULL); } else { TreeNode *p = new TreeNode(atoi(temp.c_str())); nodes.push_back(p); } } int m = nodes.size(); int p = 1; int q = 0; while (p < m) { if (nodes[q] == NULL) { q++; } else { nodes[q]->left = nodes[p]; nodes[q]->right = nodes[p+1]; p += 2; q++; } } return nodes[0]; }};
0 0
- 题目:二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉搜索树的序列化和反序列化
- 二叉树的序列化和反序列化
- lintcode,二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 【二叉树】二叉树序列化和反序列化
- 序列化二叉树(二叉树的序列化和反序列化)
- 摘花生 http://bailian.openjudge.cn/summeracm2014final/L/
- Sicily 1325. Digit Generator
- 采用html 的a标签,href连接为文件时无法下载解决方案
- [看书日记20160107]消息机制
- IOCP 概述
- 二叉树的序列化和反序列化
- AndroidStudio-/vendor/lib, /system/lib]]] couldn't find "libweibosdkcore.so"
- Python 学习过程一些小的知识点汇总 备忘
- 史上最易懂的Android jni开发资料--NDK环境搭建
- android系统架构解析
- 一个矩阵,从左到右递增,从上到下递增,从这个矩阵中找某个数
- 你真的了解android getX getRawX view移动的原理吗????
- ITOO4.1之NuGet发布问题
- java.net.BindException: Address already in use: JVM_Bind