已知前序中序、中后序重建二叉树(未完)

算法笔记中的中后序重建前序

前:1 2 4 5 3 6 7
中:4 2 5 1 6 3 7
后:4 5 2 6 7 3 1
层:1 2 3 4 5 6 7

#include
#include
#include
#include
using namespace std;
struct node{
	node *right,*left;
	int e;
};
const int maxn=30;
int pre[maxn],in[maxn],post[maxn];
int n;
node* create(int postl,int postr,int inl,int inr){
	if(postl>postr)
	return NULL;
	node* root=new node;
	root->e=post[postr];
	int k;
	for(k=inl;k<=inr;k++){
		if(in[k]==post[postr])
		break;
	}
	int numLeft=k-inl;
	root->left=create(postl,postl+numLeft-1,inl,k-1);
	root->right=create(postl+numLeft,postr-1,k+1,inr);
	return root;
}
void BFS(node* root){
	queueq;
	q.push(root);
	while(!q.empty()){
		node* n=q.front();
		cout<e;
		q.pop();
		if(n->left) q.push(n->left);
		if(n->right) q.push(n->right);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i

分析:解法采用递归思想,根据后序的最后一个是根节点的特点将中序二叉树分为两个部分,再使用递归思想,将左右子树当作根节点处理,
在递归中,通过寻找后序的最后一个结点在中序的位置,将中序分为两个部分,根据中序左右子树的个数,将后序分为两个部分
注意:在二叉树的重建中,只有给定中序才能重建,即中前,中后,中层才可以重建

下面是我自己实现中前序重建二叉树,我也不知道自己什么时候才能折腾出来,先立个flag吧

不难不难,一会会就弄好了,哈哈

#include
#include
#include
#include
using namespace std;
struct node{
	node* right,*left;
	int date;
};
const int maxn=30;
int pre[maxn],in[maxn],n;
node* create(int prel,int prer,int inl,int inr){
	if(prel>prer) return NULL;
	node* root=new node;
	root->date=pre[prel];
	int k;
	for(k=inl;k<=inr;k++){
		if(in[k]==pre[prel])
		break;
	}
	
	int num=k-inl;
	 root->left=create(prel+1,prel+num,inl,k-1);
	 root->right=create(prel+1+num,prer,1+k,inr);
	 return root;
}
void BFS(node* root){
	queueq;
	q.push(root);
	while(!q.empty()){
		node* n=q.front();
		cout<date;
		q.pop();
		if(n->left) q.push(n->left);
		if(n->right) q.push(n->right);
	}
}
int main(){
	cin>>n;
	for(int i=0;i>pre[i];
	for(int i=0;i>in[i];
	node* root=create(0,n-1,0,n-1);
	BFS(root);
	return 0;
}

作死试试层序

你可能感兴趣的:(数据结构)