二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷

容艾假發表於2020-11-11

相關知識:
映象反轉:資料傳送
二叉樹:知識大集合
題目練習:題目集
模板程式碼:

#include<iostream>
#include<queue>
using namespace std;
const int N=100;
struct tree
{
	char data;
	struct tree *lchild;
	struct tree *rchlid;
};
typedef tree* B;
tree *CreateBIT(char *a,char *b,int n)//構造二叉樹
{
	tree *t;
	int k;
	char *p;
	if(n<=0)return NULL;
	//printf("%d ",n);
	t=new tree;
	t->data = *a;
	for(p=b;p<b+n;p++)//找到根節點
	{
		if(*p==*a)
		{
			break;
		}
	}
	k=p-b;//確定位置
	t->lchild=CreateBIT(a+1,b,k);//找出左子樹的中序和前序
	t->rchlid=CreateBIT(a+k+1,p+1,n-k-1);//右子樹的中序和前序
	return t;
}
void print(tree *&b)//前序遍歷
{
	if(b!=NULL)
	{
		printf("%c",b->data);
		print(b->lchild);
		print(b->rchlid);
	}
}
void print1(tree *&b)//層次遍歷
{
	queue<B> q;
	if(b!=NULL)
	{
		q.push(b);
	} //加入根節點
	while(!q.empty())
	{
		tree *p;
		p=q.front();
		q.pop();
		printf("%c",p->data);
		if(p->lchild)
		{
			q.push(p->lchild);
		}
		if(p->rchlid)
		{
			q.push(p->rchlid);
		}
	}//層層加入並輸出
}
tree *fanzhuang(tree *&b)
{
	tree *tmp;
	if(b==NULL)return NULL;
	tmp = b->lchild;
	b->lchild = b->rchlid;
	b->rchlid = tmp;//反轉
	fanzhuang(b->lchild);
	fanzhuang(b->rchlid);//遞迴
	return b;
}
int main()
{
	int n;
	int pre[N],p[N];
	char a[N],b[N];
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>pre[i];//中序遍歷
	}
	for(int i=0;i<n;i++)
	{
		cin>>p[i];//前序遍歷
	}
	for(int i=0;i<n;i++)
	{
		a[i]=pre[i]+'0';
		b[i]=p[i]+'0';
	}
	a[n]=b[n]='\0';
	tree *c;
	c=new tree;
	c=CreateBIT(b,a,n);
	c=fanzhuang(c);//映象翻轉
	print1(c);//層次遍歷
	return 0;
}
/*

*/

輸入:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

輸出:(反轉後的層次遍歷輸出)

4617532

相關文章