干货|数据结构作业——二叉树
数据结构作业——二叉树
要求
1,创建一个二叉树
2,非递归遍历二叉树先序遍历,后序,中序
3,统计树的高度
4,统计树的度
5,销毁树
代码
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;
}
更多有趣的内容
请长按
❤
长按二维码关注
戳阅读原文与作者交流