干货|数据结构作业——二叉树
数据结构作业——二叉树
要求
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;}
更多有趣的内容
请长按
❤
长按二维码关注
戳阅读原文与作者交流
