重建二叉树

来源:互联网 发布:自动化行业用单片机吗 编辑:程序博客网 时间:2024/06/06 08:30

重建二叉树

要求:由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5) 
解题思路:在前序遍历的数组中取出第一个元素,在中序遍历中找到该元素,以该元素为中心左半部分是其左子树上的元素,右半部分是其右子树上的元素。

tree

#include <iostream>
#include <vector>

using namespace std;

int prev[1024];//前序遍历的数组
int in[1024];//中序遍历
char a[1024];
char b[1024];

template <class T>
struct bn{
bn<T>* _le;
bn<T>* _ri;
T _d;

bn(T d)
:_le(NULL)
,_ri(NULL)
,_d(d)
{}
};

template <class T>
class tr{
typedef bn<T> nd;//Node
typedef bn<T>* pnd;//pNode
public:
tr()
:_rt(NULL)
{}
void Ct(T* in, T* prev,int sz)//creat Tree
{
//递归建树
_Ct(_rt,in,prev,sz);
}

void cl()//clear
{
_ds(_rt);//destroy
_rt = NULL;
}

void pt()
{
_pt(_rt);//post_oder
cout<<endl;
}

~tr()
{
_ds(_rt);
}

protected:
void _pt(pnd r)
{
if (r == NULL)
return;
_pt(r->_le);
_pt(r->_ri);
cout<<r->_d<<" ";
}

void _ds(pnd r)
{
if (r == NULL)
return;
_ds(r->_le);
_ds(r->_ri);
delete r;
}
void _Ct(pnd& rt,T* prev, T* in,int sz)
{
if (0 == sz)
return;
if (NULL == rt)
rt = new nd(prev[0]);
int i;
for (i = 0; i < sz; ++i)
{
if (prev[0] == in[i])
break;
}
if (i < sz){
size_t lfsz = i;
size_t rtsz = sz - i - 1;
//注意界限
_Ct(rt->_le,prev+1,in,lfsz);//构造左子树
_Ct(rt->_ri,prev+i+1,in + i + 1,rtsz);//构造右子树
}
}
protected:
pnd _rt;
};


int main()
{
tr<int> t;
while (scanf("%s%s",&a,&b) == 2){
int al = strlen(a);
int bl = strlen(b);

if (bl != al){
printf("input error\n");
}
else{
int sz = sizeof(prev);
memset(prev,0,sz);
memset(in,0,sz);
for (int i = 0; i < al; ++i){
prev[i] = a[i] - '0';
in[i] = b[i] - '0';
}
t.Ct(prev,in,al);
t.pt();
t.cl();
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
原创粉丝点击