数据结构作业——二叉树(非递归遍历及其相关功能)

数据结构作业——二叉树

要求

1,创建一个二叉树
2,非递归遍历二叉树先序遍历,后序,中序
3,统计树的高度
4,统计树的度
5,销毁树

代码

#include<bits/stdc++.h>
using namespace std;
int Num_0,Num_1,Num_2;
int high=0;
//二叉树 
typedef struct tree{
	char x;
	tree *lift,*right;
} tre,*tre_list;
//栈 
typedef struct Stack{
	tree *T;
	Stack *nex;
} Stack_list;
//删除函数 
void Pop(Stack &l) 
{
	Stack *p;
	p=new Stack;
	
	p=l.nex;
	l.nex=p->nex;
	delete p;
} 
//插入函数
void Push(Stack &l,tre *x)
{
	Stack *p;
	p=new Stack;
	p->T=x;
	p->nex=l.nex;
	l.nex=p;
}
//得到顶元素函数 
tree* Top(Stack &l)
{
	return l.nex->T;
} 
//判空函数
bool Empty(Stack &l)
{
	if(l.nex==NULL) return 1;
	return 0;
}
void Clear(tre_list &l)
{

	if(l->lift!=NULL) Clear(l->lift);
	if(l->right!=NULL) Clear(l->right); 
	delete l;
} 

//创建一棵树 
void greate_tree(tre_list &l,int i)
{
	

	char c;
	int sum=0;
	scanf("%c",&c);
	if(c=='#'){
		l=NULL;
		return;
	}
	else {
		l=new tre;
		l->x=c;
		greate_tree(l->lift,i+1);
		greate_tree(l->right,i+1);
	}
	if(l->lift!=NULL)  sum++;
	if(l->right!=NULL) sum++;
	if(sum==1) Num_1++;
	if(sum==2) Num_2++;
	if(sum==0) Num_0++;
	high=max(high,i);
}
void qian_xu(tre_list l)
{
	Stack *st;
	st=new Stack;
	st->nex=NULL;
	Push(*st,l);
	while(Empty(*st)!=1)
	{
		tre *now;
		now=new tre;
		now=Top(*st);
		Pop(*st);
		printf("%c ",now->x);
		if(now->right!=NULL) Push(*st,now->right);
		if(now->lift!=NULL)	Push(*st,now->lift);	
	}
	puts("");
}
void zhong_xu(tre_list l)
{
	Stack *st;
	st=new Stack;
	st->nex=NULL;
	tre *p;
	p=l;
	
	tre *now;
	now=new tre;
	while(!Empty(*st)||p!=NULL)
	{
		if(p!=NULL)
		{
			Push(*st,p);
			p=p->lift;
		}
		else{
			now=Top(*st);
			printf("%c ",now->x);
			p=now->right;
			Pop(*st);
		}
	}
	puts("");
}
void hou_xu(tre_list l)
{
	Stack *st;
	st=new Stack;
	st->nex=NULL;
	
	Stack *st1;
	st1=new Stack;
	st1->nex=NULL;
	
	tre *p;
	p=l;
	
	tre *now;
	now=new tre;
	while(p!=NULL||Empty(*st1)==0)
	{
		if(p!=NULL)
		{
			Push(*st,p);
			Push(*st1,p);
			p=p->right;
		}
		else {
			now=Top(*st1);
			p=now->lift;
			Pop(*st1);
		}
	}
	while(Empty(*st)==0)
	{
		now=Top(*st);
		Pop(*st);
		printf("%c ",now->x);
	}
	puts("");
}
void c_d()
{
	puts("\n                                      创建树请输入               1\n");
	puts("                                      查看前序遍历请输入         2\n");
	puts("                                      查看中序遍历请输入         3\n");
	puts("                                      查看后序遍历请输入         4\n");
	puts("                                      查看树的高度请输出         5\n");
	puts("                                      查看树的度请输入           6\n");
	puts("                                      清空树请输入               7\n");
	puts("                                      查看主菜单请输入           8\n");
	puts("                                      结束任务请输入             9\n");
}
int main()
{
	c_d();
	tre_list Two_tree;
	int x,flag=1;
	int f=0;
	while(1)
	{
		scanf("%d",&x);
		switch(x){
			case 1: 	
						if(flag==0) 
						{
							puts("你已经创建过一棵树了,请先销毁再创建"); break; 
						}
						getchar();
						puts("请按照先序遍历输入二叉树序列,孩子为空时输入#");
						puts("例如构造下面的二叉树时,输入的是 ABC##D##E#F## "); 
						puts("                        A");                      
						puts("                       /\\");
						puts("                      B  E");
						puts("                     / \\  \\");
						puts("                    C   D  F");
						
						greate_tree(Two_tree,1);
						flag=0;puts("创建完成!");break;
						
			case 2:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						puts("前序遍历的结果为:"); 
						qian_xu(Two_tree);break;
			case 3:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						puts("中序遍历的结果为:");
						zhong_xu(Two_tree);break;
				
			case 4:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						puts("后序遍历的结果为:");
						hou_xu(Two_tree);break;
						
			case 5:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						printf("树的高度为 %d\n",high);break;
			
			case 6:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						printf("度为 0 的节点个数有 %d\n",Num_0);
						printf("度为 1 的节点个数有 %d\n",Num_1);
						printf("度为 2 的节点个数有 %d\n",Num_2);break;
			
			case 7:		if(flag) {puts("你还为创建树,请先创建后再进行操作!");break;}
						Clear(Two_tree);
						flag=1;
						puts("删除完毕"); break;
			case 8:		c_d();break;
			case 9:		f=1;break;
			defalut:	puts("数据不合法请重新输入");break;			
		}
		if(f) {
			puts("感谢老师的指导!应用到此结束。");
			break;
		}
	}
	return 0;
}
发布了49 篇原创文章 · 获赞 14 · 访问量 4351

猜你喜欢

转载自blog.csdn.net/qq_43750980/article/details/103473560
今日推荐