红黑树 avl(二叉树的中序列)
题目:
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
一
/\
2 3
/\
4 5
序列化为1,2,3,null,null,4,5 ' '
思路:
遍历二叉树,把节点以下面的形式放到数组里(以示例中的二叉树为例):
[1,2,3,null,null,4,5,null,null]
观察以上数组,假设第我位元素非空,在我位之前有k个空元素,那么该元素的左边的和正确元素在数组中的位置分别是:
左边的元素位置:2*(i-k) 1
正确元素位置:2*(i-k) 2
综上,序列化后的字符串包含以上形式的数组;反序列化时,把字符串转成数组,然后根据元素的左边的和正确在数组中的位置公式建立左右子树。
代码:
/**
*二叉树节点的定义。
* struct TreeNode {
*整型值
* TreeNode *左侧;
* TreeNode *右;
* TreeNode(int x) : val(x),左(空),右(空){}
* };
*/
类别编解码器{
公众号:
//将树编码为单个字符串。
字符串序列化(TreeNode * root){ 0
if(!根)
返回"";
矢量五;
queueTreeNode * que
que.push(根);
ostringstream oss
while(!que.empty())
{
TreeNode * p=que。front();
你好。pop();
if(p)
{
oss p-val ',';
你好。推动(p-左);
你好。推动(p-右);
}其他
{
oss 'null ' ',';
}
}
字符串s=OSS。str();
返回s.substr(0,s . size()-1);
}
//将编码数据解码为树。
TreeNode*反序列化(字符串数据){ 0
int n=数据。size();
int I=0;
vecturenode * v;
当(在)时
{
int j=I;
while(jn data[j]!=',')
{
j;
}
字符串s=data.substr(i,j-I);
if(s=='null ')
五.push _ back(空ptr);
其他
v.push_back(新的TreeNode(stoi(s));
I=j ^ 1;
}
int count _ null=0;
for(int I=0;四.size();(一)
{
如果
{
int left _ index=2 *(I-count _ null)1;
if(left _ indexv。size()v[left _ index])
v[I]-左=v[left _ index];
int right _ index=2 *(I-count _ null)2;
if(right _ indexv。size()v[right _ index])
v[I]-右=v[right _ index];
}其他
{
计数_ null
}
}
if(v . size)(0)
返回v[0];
其他
返回nullptr
}
};