请实现两个函数,分别用来序列化和反序列化二叉树
Posted Olittlestone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请实现两个函数,分别用来序列化和反序列化二叉树相关的知识,希望对你有一定的参考价值。
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
//这道题的核心思想就是为了,让我们将二叉树转化成为我们自己可以看懂的字符串 //然后将这个字符串又可以转化为二叉树。这样就行了。 class Solution { public: vector<int> buf; void dfs1(TreeNode *root) { if(!root) buf.push_back(0xFFFFFF);//这个数字自己可以随便写,主要是为了记录节点值的结束的。 else { buf.push_back(root->val); dfs1(root->left); dfs1(root->right); } } TreeNode* dfs2(int* &p) { //这里用到了指针引用,这个也就是相当于给指针重新起了一个名字。 //使得我们可以在递归调用的时候操作的是同一个指针。 if(*p==0xFFFFFF) { p++; return NULL; } TreeNode* res=new TreeNode(*p); p++; res->left=dfs2(p); res->right=dfs2(p); return res; } char* Serialize(TreeNode *root) { buf.clear(); dfs1(root); int bufSize=buf.size(); int *res=new int[bufSize]; for(int i=0;i<bufSize;i++) res[i]=buf[i]; return (char*)res;//这个里面的知识点,用到的是将int型数组进行强制类型转换。 } TreeNode* Deserialize(char *str) { int *p=(int*)str; return dfs2(p); } };
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
以上是关于请实现两个函数,分别用来序列化和反序列化二叉树的主要内容,如果未能解决你的问题,请参考以下文章