序列化二叉树
来源:互联网 发布:基尼系数统计学算法 编辑:程序博客网 时间:2024/05/25 21:34
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
分析:
1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树。
/*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==NULL) return NULL; string str=""; Serializestr(root,str); //用string来存储先序遍历的二叉树序列 char *res=new char[str.size()+1]; for(int i=0; i<str.size(); ++i) res[i]=str[i]; //将string字符串赋值给char* res[str.size()]='\0'; return res; } void Serializestr(TreeNode* root, string &str) //保存每次递归时的str值 { if(root==NULL) { str+="#,"; //到达根节点或叶子结点时,添加一个#表示接在叶子结点后的空指针NULL return; } str+=to_string(root->val)+","; Serializestr(root->left,str); // 遍历左子树 Serializestr(root->right,str); //遍历右子树 } TreeNode* Deserialize(char *str) { if(str==NULL||str[0]=='\0') return NULL; int num=0; return Deserializenum(str,num); //递归过程需要记录遍历到哪个位置 } TreeNode* Deserializenum(char* str,int &num) { int val=0; if(str[num]=='#') { num+=2; return NULL; } while(str[num]!=','&&str[num]!='\0') //逗号分隔各个节点的值 { val=val*10+str[num]-'0'; //将各个节点的字符串转换成整数 ++num; } ++num; TreeNode* root=new TreeNode(val); //创建二叉树的各个节点 root->left=Deserializenum(str,num); root->right=Deserializenum(str,num); return root; }};
阅读全文
0 0
- 二叉树序列化
- 二叉树序列化
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 二叉树序列化
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 写给后端的前端笔记:定位(position)
- vue常用过滤器
- Spark官方文档翻译:Quick Start
- HDOJ HDU 1022 Train Problem I
- hy
- 序列化二叉树
- CodeForces
- 算法学习——并查集
- LeetCode 53. Maximum Subarray
- ffmpeg 使用笔记(一)
- 顶部和底部固定中间自适应的布局
- java数组的定义初始化关于内存的理解
- QT打包.exe可执行程序
- mysql 远程登入设置