vlambda博客
学习文章列表

干货|数据结构作业——二叉树


数据结构作业——二叉树



要求


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;}



更多有趣的内容

请长按


干货|数据结构作业——二叉树
干货|数据结构作业——二叉树
干货|数据结构作业——二叉树

长按二维码关注




戳阅读原文与作者交流