反序列化(層序)
阿新 • • 發佈:2018-10-31
反序列化操作(層序):將序列生成層序遍歷的二叉樹
取出string陣列中的每一個str[i]元素,根據str[i]是否是#進行處理,
(1)當str[i]=="#"時,返回NULL,不建立新節點
(2)當str[i]!="#"時,建立新的節點,返回該節點
#include <iostream>
#include<queue>
#include <string>
using namespace std;
typedef struct TreeNode
{
string data;
struct TreeNode* lchild;
struct TreeNode* rchild;
}TreeNode;
void levelTraver(TreeNode* T) //層次遍歷
{
if (!T)
return;
queue<TreeNode*> Q;
TreeNode* cur = T;
Q.push(cur);
while (!Q.empty())
{
cout << Q.front()->data << " ";
cur = Q.front();
Q.pop();
if (cur->lchild)
Q.push(cur->lchild);
if (cur->rchild)
Q.push(cur->rchild);
}
}
TreeNode* NodebyString(string s) //根據s的值
{
if (s == "#") //若str[i]的值為#,則不建立節點
return NULL;
else //否則,建立節點並返回
{
TreeNode* node = new TreeNode;
node->data = s;
return node;
}
}
TreeNode* levelDeSerialize(string str[]) //層序反序列化
{
int index1 = 0;
TreeNode* T = NodebyString(str[index1++]);
queue<TreeNode*> Q;
if (T != NULL)
Q.push(T);
TreeNode* cur;
while (!Q.empty())
{
cur = Q.front();
Q.pop();
cur->lchild = NodebyString(str[index1++]);
cur->rchild = NodebyString(str[index1++]);
if (cur->lchild)
Q.push(cur->lchild);
if (cur->rchild)
Q.push(cur->rchild);
}
return T;
}
int main()
{
string str[] = { "1", "2", "3", "#", "4", "5", "#", "#", "#", "#", "#" };
TreeNode* T = levelDeSerialize(str); //反序列化
cout << "層序遍歷" << endl;
levelTraver(T);
return 0;
}