本文共 1233 字,大约阅读时间需要 4 分钟。
,二叉树的序列化:.二叉树根据某种规则转换为字符串的过程(为什么要有这种操作,可以把二叉树序列化成字符串后保存在文件中)
二叉树的反序列化: 根据某种规则把字符串转换成二叉树的表示形式
序列化的方式:
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层次遍历序列化代码: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; queuequ; //将根节点压入队列 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;}
转载地址:http://aiumi.baihongyu.com/