#include<iostream>
#include<cstdlib>
using namespace std;
int pre[1005],mid[1005];
bool flag;
struct Node
{
int num;
Node *lChild,*rChild;
};
void buildTree(Node* &T,int start1,int end1,int start2,int end2) //递归建树
{
int i=start2;
if(flag==false) //主函数调用这个函数前已经先初始化为true了
return ; //此时不能建树
flag=false;
for(i=start2;i<=end2;i++) //能在中序遍历中找到前序中存在的节点 ,当找不到时在下一次递归中会发现并停止建树
{
if(pre[start1]==mid[i])
{
flag=true;
break;
}
}
T=(Node*)malloc(sizeof(Node));
T->num=pre[start1]; //分配节点保存
if(i==start2)
{
T->lChild=NULL; //无左子树
}
else
{
buildTree(T->lChild,start1+1,start1+i-start2,start2,i-1); //对左子树递归
}
if(i==end2)
{
T->rChild=NULL; //无右子树
}
else
{
buildTree(T->rChild,start1+i-start2+1,end1,i+1,end2); //对右子树递归
}
}
//后序遍历,还是递归吧,非递归遍历树还没仔细研究
void post(struct Node * T)
{
if(T)
{
post(T->lChild);
post(T->rChild);
cout<<T->num<<" ";
}
}
int main()
{
Node *tree;
int length,n,i,data;
while(cin>>n)
{
for(i=1;i<=n;i++)
cin>>pre[i];
for(i=1;i<=n;i++)
cin>>mid[i];
flag=true;
buildTree(tree,1,n,1,n);
if(flag==false)
{
cout<<"No";
}
else
{
post(tree);
}
cout<<endl;
}
return 0;
}
/**************************************************************
Problem: 1385
User: 萧然677
Language: C++
Result: Accepted
Time:10 ms
Memory:1528 kb
****************************************************************/
题目1385:重建二叉树
最新推荐文章于 2020-05-09 10:39:09 发布