首页天道酬勤红黑树 avl(二叉树的中序列)

红黑树 avl(二叉树的中序列)

admin 12-04 06:28 263次浏览

题目:

请实现两个函数,分别用来序列化和反序列化二叉树。

示例:

你可以将以下二叉树:

/\

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

}

};

Part2_扩展MATSIM_Subpart8_自动校准_第32章 CaDyTS: 动态交通模拟的校准怎么使用C++ OpenCV实现图像拼接
彻底告别贫困(彻底告别某个城市用什么词) 腾讯会员6元一个月(算法的时间复杂度是指什么)
相关内容