算法编程题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;
}
二叉树的反序列化: 根据某种规则把字符串转换成二叉树的表示形式
序列化的方式:
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;
}
相关文章推荐
- [算法]二叉树的序列化、反序列化
- 使用层序遍历序列化和反序列化二叉树
- 二叉树的序列化和反序列化
- 二叉树学习小结(序列化和反序列化、二叉树遍历、二叉树镜像、二叉搜索树、二叉树子结构等)
- 7. 二叉树的序列化和反序列化
- 九章算法面试题51 二叉树的序列化
- 二叉树的序列化和反序列化java借助队列实现
- 剑指offer56--二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 面试题37:序列化二叉树和反序列化二叉树
- LintCode 二叉树的序列化和反序列化 题解
- 剑指offer 编程题(58):序列化二叉树
- 剑指offer 面试题62 序列化和反序列化二叉树
- 二叉树基础之序列化和反序列化二叉树
- leetcode 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化 + 深度优先遍历DFS
- 二叉树序列化与反序列化 (非递归)
- 二叉树的序列化和反序列化实现(C++)
- 题目:二叉树的序列化和反序列化
- 二叉树的序列化和反序列化
- 剑指offer-二叉树的序列化和反序列化(困惑)-Java