反序列化:将string生成二叉树

先序反序列化操作具体步骤:
(1)先将string字符串进行分割,生成多个string构成的集合保存在vector<string>中;
(2)将vec<string>中的每一个元素存入到queue<string>中
[说明]此时已经将string转换成为能够序列化的queue<string>队列。
/*****************************************************/
(3)对queue<string>队列进行序列化操作
A.参数——queue<string>&,返回值TreeNode*
B.获取队头结点存给变量value,并将队头结点出队列判断value是否等于NULL(即:value == "#")①若等于,返回空;②若不等,则new出T结点,并赋值T->str = value;再递归创建左子树:T->lchild = recon(Q);再递归创建右子树:T->rchild = recon(Q);最后返回T=====================================================#include <vector>
#include <string>
#include <iostream>
#include <queue>
using namespace std;typedef struct TreeNode
{string data;struct TreeNode* lchild;struct TreeNode* rchild;
}TreeNode;vector<string> split(const string &s, const string &seperator)  //相当于java中的split函数
{ //返回值是string类型的容器vector<string>vector<string> result;typedef string::size_type string_size;string_size i = 0;while (i != s.size()){//找到字符串中首个不等于分隔符的字母;int flag = 0;while (i != s.size() && flag == 0){flag = 1;for (string_size x = 0; x < seperator.size(); ++x)if (s[i] == seperator[x]){++i;flag = 0;break;}}//找到又一个分隔符,将两个分隔符之间的字符串取出;flag = 0;string_size j = i;while (j != s.size() && flag == 0){for (string_size x = 0; x < seperator.size(); ++x)if (s[j] == seperator[x]){flag = 1;break;}if (flag == 0)++j;}if (i != j){result.push_back(s.substr(i, j - i));i = j;}}return result;
}void pretravel(TreeNode* T)  //先序遍历
{if (T != NULL){cout << T->data << " ";pretravel(T->lchild);pretravel(T->rchild);}
}TreeNode* Deserialize1(queue<string>& Q) //反序列化操作
{string value = Q.front(); //获取队头元素值,并出队Q.pop();if (value == "#") //NULL{return NULL;}TreeNode* T = new TreeNode;  //创建根节点TT->data = value;T->lchild = Deserialize1(Q); //递归创建左子树T->rchild = Deserialize1(Q); //递归创建右子树return T;
}int index = -1;  //定义全局变量TreeNode* Deserialize2(vector<string>& Arr)
{index++; //依次遍历vector<string>中的每一个元素if (index >= Arr.size() || Arr[index] == "#"){return NULL;}TreeNode* T = new TreeNode;T->data = Arr[index];T->lchild = Deserialize2(Arr);T->rchild = Deserialize2(Arr);return T;
}
int main()
{string s = "30,10,50,#,#,#,20,45,#,#,35,#,#";vector<string> Arr = split(s, ","); //可按多个字符来分隔queue<string> Q;for (int i = 0; i < Arr.size(); i++)  //将vec<string>每一个元素存入到queue<string>队列中Q.push(Arr[i]);TreeNode* head1 = Deserialize1(Q); //反序列化pretravel(head1); //先序遍历cout << endl;TreeNode* head2 = Deserialize2(Arr); //反序列化pretravel(head2); //先序遍历return 0;
}

剑指offer(64):序列化二叉树http://blog.csdn.net/u011080472/article/details/51290794

反序列化(先序)——split : string--vectorstring相关推荐

  1. C#String.Split (string[], StringSplitOptions) 多参数分割得到数组

    public string[] Split(string[] separator,StringSplitOptions options) 参数 separator类型:System.String[]分 ...

  2. 字符串分割(split),将字符串按照指定字符进行分割。split(String regex)和split(String regex, int limit)

    一.split(String regex)字符串分割,将字符串按照指定字符进行分割,返回的是一个字符串数组. public String[] split(String regex) {return s ...

  3. codevs1013 求先序排列 string黑科技[三星]

    题目链接:戳我 题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input Description ...

  4. 【Flink】FLink 反序列化空指针 java.lang.String.<init> SimpleStringSchema

    文章目录 1.概述 2.场景2 1.概述 我的任务运行一段时间,出这个警告,任务就挂掉了,错误如下 2021-12-02 10:51:55,644 WARN

  5. 序列化和反序列化二叉树 -----前序,中序,后序,层序

    目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...

  6. Java String.split()用法小结

    2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: ...

  7. 注意String.Split的几个重载形式

    String.Split应该是经常用到的一个函数了,经常的有下面两种形式        public string[] Split(char[] separator, StringSplitOptio ...

  8. java诡异的String.split()方法

    Reference https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) 正文 ...

  9. Java String split 使用详解、split 方法存在的一些坑

    String 方法的split 其实是很有学问的,他有很多的特殊情况.我们来梳理一下: 备注:limit 是 split(String regex, int limit ) 方法的第二个参数,&quo ...

  10. linux string split,linux下awk内置函数的使用(split/substr/length)

    一.split 初始化和类型强制 awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中.你可以自己定义域分隔符或者使用现在FS(域分隔符)的值. 格式: split (string, ...

最新文章

  1. ubuntu18.04下双机驱动调试
  2. 从头学习Drupal--基本架构二
  3. 雷柏鼠标怎么配对接收器_四款蓝牙鼠标的详细使用体验对比
  4. hdu 3853 LOOPS (概率dp 逆推求期望)
  5. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
  6. Ubuntu安装 到移动硬盘--操作系统随身携带
  7. 半圆阴影_圆中阴影部分面积求法的常用方法
  8. TEAM WORK 認清自己的角色
  9. Nginx安装及配置简介
  10. boa服务器如何运行cgi,嵌入式WEB服务器BOA+CGI.ppt
  11. git status怎么操作_新手 git 简明操作指南
  12. mysql 5个约束条件,Mysql入门第五课《外键约束》
  13. MYSQL中ALTER命令
  14. 阵列信号处理 窄带信号与包络
  15. DSP技术-2-DSP的C语言同主机C语言的主要区别在哪里?
  16. windows下的git配置,puttygen.exe生成公钥
  17. 获取jpg(或jpeg)图片中的详细信息(EXIF信息)
  18. 印度软件与信息服务业发展经验及启示
  19. JavaScript将后端获取到的byte数组转为文件
  20. 性别计算机英语怎么说,性别教育用英语怎么说?

热门文章

  1. Spring-data-redis:特性与实例--转载
  2. java获取当前方法
  3. 【个人成长】数据分析——证书
  4. 从0到1建立一张评分卡之变量分箱
  5. php如何从左往右轮播,js实现从左向右滑动式轮播图效果
  6. 小工匠聊架构-超高并发秒杀系统设计 03_热点数据的处理
  7. 并发编程-04线程安全性之原子性Atomic包的4种类型详解
  8. 实战SSM_O2O商铺_39【前端展示】首页轮播图和一级商铺Dao+Service+Controller层的实现
  9. Linux-locate/slocate命令
  10. php todo和其他备注,Vim中列出TODO与FIXME等备注的方法