实验4 树、图及其应用————二叉树的遍历一、任务和目的具体任务,达到的目的。
设计一个程序演示在二叉树上进行三种遍历的过程。
【基本要求】(1)从键盘上输入二叉树的每一个结点,演示二叉树T的建立过程。
(2)演示各种遍历的遍历过程。
二、概要设计主要数据结构定义,函数功能及各参数用途。
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <windows.h>struct bitnode{char data;struct bitnode *lchild, *rchild;}bitnode;//树叶结构体定义void createbitree(struct bitnode ** t);//建立二叉树(用前序法)void visit(struct bitnode *e);//输出结点void preordertraverse(struct bitnode *t);//前序遍历void choose_menu();//选择菜单void inordertraverse(struct bitnode *t);//中序遍历void postordertraverse(struct bitnode *t);//后序遍历三、详细设计各函数具体实现。
//建立二叉树(用前序法)void createbitree(struct bitnode ** t){char x;struct bitnode *q;printf("\n 请输入数据");x=getchar();if(x!='#') getchar();if (x=='#'){getchar();printf(" 该节点为空\n");return;}q=(struct bitnode*)malloc(sizeof(struct bitnode));q->data=x;q->lchild=NULL;q->rchild=NULL;*t=q;printf(" 数据是: %c, 此数据地址是: %o\n",q->data,q);createbitree(&q->lchild);createbitree(&q->rchild);return;}//用递归法创建二叉树(附加地址数据左右孩子结点的地址)//如果输入#则表示孩子结点为空//输出结点void visit(struct bitnode *e){printf(" 结点数据是: %c, 结点的地址是: %o,\n 结点的左孩子地址是: %o, 结点的右孩子地址是: %o\n",e->data,e,e->lchild,e->rchild);printf("\n输入任意键继续。
\n");getchar();}//前序遍历void preordertraverse(struct bitnode *t){struct bitnode *p;p=t;if(p){visit(p);preordertraverse(p->lchild);preordertraverse(p->rchild);return ;}elsereturn ;}//中序遍历void inordertraverse(struct bitnode *t){struct bitnode *p;p=t;if(p){inordertraverse(p->lchild);visit(p);inordertraverse(p->rchild);return ;}elsereturn ;}//后序遍历void postordertraverse(struct bitnode *t){struct bitnode *p;p=t;if(p){postordertraverse(p->lchild);postordertraverse(p->rchild);visit(p);return ;}elsereturn ;}//选择菜单void choose_menu(struct bitnode * t){int x;system("cls");printf("1.->先根遍历二叉树\n");printf("2.->中根遍历二叉树\n");printf("3.->后根遍历二叉树\n");printf("4.->退出\n");scanf("%d",&x);getchar();switch(x){case 1 :preordertraverse(t);printf("以上是前序遍历的过程...\n");getchar();choose_menu(t);break;case 2 :inordertraverse(t);printf("以上是中序遍历的过程...\n");getchar();choose_menu(t);break;case 3 :postordertraverse(t);printf("以上是后序遍历的过程...\n");getchar();choose_menu(t);break;case 4 :printf("感谢您的使用,再见。
");break;default:printf("对不起您的输入有误,请重新选择....");choose_menu(t);break;}}int main(){struct bitnode *t;int count=0;printf("*************************************************************\n");printf("*************************************************************\n");printf("*******************建立并遍历二叉树程序**********************\n");printf("*************************************************************\n");printf("************ ***************\n");printf("************ 信息07-2---0701050402 ***************\n");printf("************ ***************\n");printf("*************************************************************\n");printf("*************************************************************\n");printf("*************************************************************\n");printf("\n输入提示:每个结点数据只能输入一个字符,空节点输入#。
请注意该输入顺序与二叉树的先根遍历顺序一样。
\n");createbitree(&t);printf("二叉树已经建立完毕\n");printf("输入任意键继续。
");getchar();choose_menu(t);}四、调试分析调试中出现的问题及原因、解决办法。
怎么实现演示呢??非递归怎么实现?要演示只能非递归,如果递归,只能输出节点的所有信息。
地址,左右孩子节点的信息五、测试用例及结果给出多组例子及结果。
如图的二叉树:先序遍历: A、B、D、F、G、C、E、H 。
中序遍历: B、F、D、G、A、C、E、H 。
后序遍历: F、G、D、B、H、E、C、A 。
程序运行如下:1.建立二叉树(输入顺序为先序遍历顺序)2.先序遍历遍历二叉树:3.中序遍历遍历二叉树:4.后序遍历遍历二叉树:。