您的位置:首页 > 理论基础 > 数据结构算法

数据结构和算法经典100题-第33题

2016-01-03 18:13 411 查看
题目要求:

二叉树的序列化和反序列化。二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原理二叉树的过程叫做二叉树的反序列化。

请设计一种方案实现二叉树的序列化和反序列化。

题目解析:

用两种方法:

1.先序遍历法:

先序遍历二叉树序列化,先序遍历法重建二叉树。

2.层序遍历法:

层序遍历二叉树序列化,层序遍历法重建二叉树。

关键点:

空节点用#!表示,一个普通节点如1,用1!表示。其中!表示一个节点值的结束。

先序遍历和层序遍历的过程都比较基础,在这里就不详细叙述了。我下面直接给出两种方案的代码。

先序遍历二叉树序列化与反序列化:

struct Node {
string value;
Node *left;
Node *right;
Node(string value) {this->value = value;}
~Node() { };
};

// 层序遍历序列化和反序列化二叉树
string serialByPre(Node *head) {
string res;
if (!head) {
res = "#!";
return res;
}
res = head->value + "!";
res += serialByPre(head->left);
res += serialByPre(head->right);
return res;
}

Node *reconPreOrder(queue<string> &Q) {
string value = Q.front();
Q.pop();

if ("#" == value) {
return NULL;
}

Node *head = new Node(value);
head->left = reconPreOrder(Q);
head->right = reconPreOrder(Q);
return head;
}

Node *reconByPreString(const string &preStr) {
queue<string> Q;
int len = (int)preStr.size();
for (int i = 0; i < len; ++i) {
string strTmp;
if ('!' != preStr[i]) {
strTmp += preStr[i];
} else {
Q.push(strTmp);
}
}
return reconPreOrder(Q);
}


层序遍历二叉树序列化与反序列化:

// 层序遍历序列化和反序列化二叉树
string serialByLevel(Node *head) {
string res;
queue<Node*> Q;
Q.push(head);

while (!Q.empty()) {
Node * tmp = Q.front();
Q.pop();
if (!tmp) {
res += "#!";
} else {
res += tmp->value;
res += "!";
}

if (!tmp->left) {
Q.push(tmp->left);
}
if (!tmp->right) {
Q.push(tmp->right);
}
}
return res;
}

Node *generateNode(string &value) {
if ("#" == value) {
return NULL;
}
return new Node(value);
}

Node *reconBylevelString(const string &levelStr) {
vector<string> strArr;

int len = (int)levelStr.size();
for (int i = 0; i < len; ++i) {
string strTmp;
if ('!' != levelStr[i]) {
strTmp += levelStr[i];
} else {
strArr.push_back(strTmp);
}
}

queue<Node*> queueNode;
int index = 0;
Node *head = new Node(strArr[index]);
if ("#" != strArr[index]) {
queueNode.push(head);
} else {
return NULL;
}
while (!queueNode.empty()) {
Node *nodeTmp = queueNode.front();
queueNode.pop();
nodeTmp->left = generateNode(strArr[index++]);
nodeTmp->right= generateNode(strArr[index++]);
if (!nodeTmp->left) {
queueNode.push(nodeTmp->left);
}
if (!nodeTmp->right) {
queueNode.push(nodeTmp->right);
}
}

return head;
}


路漫漫其修远兮,吾将上下而求索…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息