树形结构及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树形结构及其应用
树形结构及其应用实验题目:树型结构的建立与遍历设计成绩报告成绩指导老师
一、实验目的1、学会二叉树这一数据结构的用法,掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。2、熟练掌握二叉树与广义表之间的相互转换方法。3、熟练掌握二叉树的先序、中序、后序,递归与非递归遍历算法。4、学会二叉树线索化方法,并掌握线索二叉树的存储结构。5、熟练掌握线索二叉树的先序、中序、后序的遍历算法。
二、实验要求及实验环境1、实验要求:(1)
至少用两种方法,编写建立二叉树的二叉链表存储结构的程序,并用广义表的形式显示并保存二叉树;(2)
采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序遍历的递归和非递归算法以及层序遍历算法,并显示二叉树和相应的遍历序列;(3)
在二叉树的二叉链表存储结构基础上,编写程序实现二叉树的先序、中序和后序线索链表存储结构建立的算法,并用广义表的形式显示和保存二叉树的线索链表;(4)
在二叉树的线索链表存储结构上,编写程序分别实现求一个结点的先序(中序、后序)的后继结点的算法;(5)
在 (4)
基础上,编写程序实现对线索二叉树进行先序、中序和后序遍历的非递归算法,并显示线索二叉树和相应的遍历序列。2、实验环境:Windows下的dev-c++、
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)Create a bit-
tree1.逻辑设计主程序流程递归中序线索化线索化递归中序线索化递归先序线索化以广义表格式输出树递归非递归先序遍历递归非递归中序遍历递归非递归后序遍历输出节点的后继节点遍历后序线索化遍历中序线索化遍历先序线索化线索二叉树链式结构定义typedef struct bitnode{ char data; struct bitnode
*lchild,*rchild; bool LTag,RTag; }bnode,*btree;2.物理设计Btree create()创建一棵树并赋值应用数组栈btree
a[MAX]Void printBTree(btree T)以广义表形式打印树Void preorder(btree t)先序递归遍历Void inorder(btree t)中序递归遍历Void postorder(btree t)后序递归遍历btree
copy(btree t)复制二叉树Int main()主函数Void
preorder2(btree t)先序非递归遍历Void inorder2(btree t)中序非递归遍历Void postorder2(btree t)后序非递归遍历层序遍历void levelorder(btree t)void prethreading(btree p)先序线索化Btree preorderthreading(btree prehead,btrreeT);先序线索化void prethreading(btree p)先序线索化Btree inorderthreading(btree prehead,btrreeT);中序线索化void
prethreading(btree p)先序线索化Btree
postorderthreading(btree prehead,btrreeT);后序线索化寻找
字符X处于线索树中位置btree locate(char a,btree t)中序线索化后继节点Btree innext(btree p);输出后继节点先序线索化后继节点Btree prenext(btree p)Void printlist(btree t,bool
a)广义表形式输出线索化后的二叉树
四、测试结果
五、系统不足与经验体会不能连续输入多个广义表。函数设
计不够简洁。
没有实现非递归线索化加注释后修改代码方便六、附录:源代码(带注释)#include h>#define MAX100typedef struct bitnode{ char data; struct bitnode *lchild,*rchild; bool LTag,RTag; }bnode,*btree; //建立树线索化结构体struct bitnode *s[MAX];struct bitnode *pre=NULL; btree create(){ char ch; scanf("%c",&ch); if(ch==#) return NULL; else { btree bt=(btree)malloc(sizeof(bnode)); if(bt==NULL) return NULL; else{ bt->data=ch; bt->lchild=create(); bt->rchild=create(); return bt; } }}btree create2(){ int i,j; btree bt,t; char ch; printf("输入一个整数和一个字符 \n"); scanf("%d %c",&i,&ch); while(i!=0&&ch!=0) { bt=(btree)malloc(sizeof(bnode)); if(bt==NULL) return NULL; else { bt->data=ch; bt->lchild=NULL; bt- >rchild=NULL; s[i]=bt; if(i==1) t=bt; else { j=i/2; if(i%2==0) s[j]->lchild=bt; else s[j]->rchild=bt; } } printf("输 入一个整数和一个字符\n"); scanf("%d %c",&i,&ch); } return t;}//复制一棵二叉树btree copy(btree BT){ btree tree;if(BT==NULL) tree=NULL;else{tree=(btree)malloc(sizeof(bnode));tree ->data=BT->data;tree->lchild=copy(BT->lchild);tree- >rchild=copy(BT->rchild); }return tree; }//层序遍历并输出void levelorder(btree bt){ btree t[MAX]; //建立队列 int front=0,rear=1; btree p; t[0]=bt; while(front // 左孩子进队列(如果有的话),右孩子进队列(如果有的话) t[rear++]=t[front]->lchild; if(p->rchild) t[rear++]=t[front]->rchild; ++front; }} //先序递归遍 历并输出void preorder(btree bt) { if (NULL!=bt) { printf("%c ",bt->data); preorder(bt->lchild); preorder(bt->rchild); } } //先序非递归遍历并输出void