重建二叉树
来源:互联网 发布:自动化行业用单片机吗 编辑:程序博客网 时间:2024/06/06 08:30
重建二叉树
要求:由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5) 解题思路
:在前序遍历
的数组中取出第一个
元素,在中序遍历
中找到该元素,以该元素为中心
左半部分是其左子树上的元素,右半部分是其右子树上的元素。
#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;
}
阅读全文
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 打桩?——怎么用?
- 深度学习:Demo1-MNIST
- Tomcat目录结构含义
- 定位底部的输入框被软键盘覆盖解决方案
- Java 的版本历史与特性
- 重建二叉树
- 学习网站
- win10 java jdk环境变量 配置
- Linux打印time_t的方法
- 约瑟夫环实现算法
- Blockchain的鱼和熊掌系列(21)之 keccak(sha-3) linux 下使用
- MAVEN Scope使用
- 将工程部署在tomcat服务器上
- 二级列表的简单效果实现