您的位置:首页 > 编程语言

算法编程题2-二叉树的序列化和反序列化

2017-08-03 13:31 351 查看
,二叉树的序列化:.二叉树根据某种规则转换为字符串的过程(为什么要有这种操作,可以把二叉树序列化成字符串后保存在文件中)

二叉树的反序列化: 根据某种规则把字符串转换成二叉树的表示形式

序列化的方式:

1.根据先序遍历序列化

2.根据中序遍历序列化

3.根据后序遍历序列化

4.按层序列化

题目实例:

二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原来二叉树的过程叫做二叉树的反序列化。给定一颗二叉树的头结点head,并已知二叉树节点值的类型为

32位整型。请设计一种

二叉树序列化和反序列化的方案,并用代码实现

方案:

  我们采取先序遍历的方式对二叉树序列化

  (1)假设序列化结果为str,初始时str为空字符串

  (2)先序遍历二叉树时如果遇到空节点,在str末尾加上“#!”(#表示NULL,!表示结束)。

  (3)如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".

注意:如果没有结束符,则可能会产生歧义

采用上述方式,选择用什么样的遍历方式序列化,就选择用什么样的方式反序列哈

采用上述方式,一棵树序列化的结果是唯一的,,唯一的结果生成的二叉树也是唯一的。

先序遍历序列化代码:

string serial(TreeNode *root)
{
string str;
TreeNode *p = root;
stack<TreeNode*> sk;

while (p || !sk.empty())
{
while (p)
{
sk.push(p);
str = str+to_string(p->val)+'!';
p = p->left;
}
if (nullptr == p)
str += "#!";
p = sk.top();
sk.pop();
p = p->right;
}
str += "#!";
return str;
}

层次遍历序列化代码:
/*采用层次遍历序列化以root为根节点的二叉树*/
string serial(node* root)
{
string str;

node *p = NULL;
queue<node*> qu;
//将根节点压入队列
qu.push(root);
while (!qu.empty())
{
p = qu.front();
qu.pop();
//操作出队的节点
str = str + to_string(p->data) + '!';
//如果出队的节点有左孩子,则入队列,
if (NULL != p->left)
qu.push(p->left);
else
str = str + "#!";
//如果出队的节点有右孩子,则入队列
if (NULL != p->right)
qu.push(p->right);
else
str = str + "#!";
}
return str;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: