1、数据结构二叉树的算法数据结构课程设计报告 二叉树算法 计算机科学与技术学院 计算机网络1102班 学号:1108040212张花二叉树算法一 课程设计目的与要求:1. 掌握二叉树的基本概念和性质2. 掌握创建和构造二叉树的算法3. 掌握二叉树存储基本的三种递归算法4. 掌握计算二叉树的结点实验要求:(1)理解二叉树的初始化 二叉树空的判断;(2)理解二叉树的遍历算法,掌握其基本应用。二实验原理及内容实验题目:1. 创建二叉树的链表结构;2. 实现二叉树链表的初始化算法,二叉树空的判断算法;3. 实现二叉树的先序遍历算法,中序遍历算法和后序遍历算法;4. 利用某遍历算法实现计算二叉树中的叶子结点
2、;5. 求二叉树中的结点数;6. 设计一个算法,求二叉树指定的结点x的层数,求先序遍历序列中第k个结点的左孩子;三课程设计内容解答: 1.二叉树的二叉链式存储结构的结点结构体定义 typedef struct nodeTElemType data; struct node *left; struct node *right; struct node *parent;BiTNode,*BiTree;2.写二叉树的先序,中序,后序遍历算法先序遍历算法void Prorder1(BiTNode *bt,void(*visit)(TElemType)if(bt!=NULL) visit(bt-data
3、); Prorder1(bt-left,visit); Prorder1(bt-right,visit); 中序遍历算法void Prorder2(BiTNode *bt,void(*visit)(TElemType)/BiTNode *p,*stackMAS; int top; top=0; p=bt; while(top!=0|p!=NULL) while(p!=NULL) stacktop=p; top+; p=p-left; if(top!=0) p=stacktop-1; top-; visit(p-data); p=p-right; 后序遍历算法void Prorder3(BiTN
4、ode *bt,void(*visit)(TElemType)/BiTNode *p,*stackMAS; int top; top=0; stacktop=bt; top+; while(top0) p=stacktop-1; top-; while(p!=NULL) visit(p-data); stacktop=p-right; top+; p=p-left; 等一系列的代码说明就不再报告中啰说还占用报告篇幅4.程序结果截图五.课程设计小结 1.指出二叉树的顺序存储和链式存储的优缺点:(顺序存储可能会浪费空间,但是读取某个指定节点的时候效率比较高) 2.将你测试使用的二叉树,如果使用顺序
5、存储,请画出存储结构3.课程设计的时间好短啊,好难的课程设计啊!附件:#include#include#define MAX 50#define MAS 20#define CHAR 1#if CHAR typedef char TElemType; TElemType Nil= ; #define form %c#else typedef int TElemType; TElemType Nil=0; #define form %d#endiftypedef struct nodeTElemType data; struct node *left; struct node *right; s
6、truct node *parent;BiTNode,*BiTree;BiTNode *InitBiTree(BiTNode *bt) bt=NULL; return bt;BiTNode *CreateBiTree(BiTNode *bt)TElemType ch; scanf(form,&ch); if(ch=Nil) bt=NULL; else bt=(BiTNode *)malloc(sizeof(BiTNode); if(!bt) exit(0); bt-data=ch; bt-parent=NULL; bt-left=CreateBiTree(bt-left); if(bt-lef
7、t) bt-left-parent=bt; bt-right=CreateBiTree(bt-right); if(bt-right) bt-right-parent=bt; return bt;void PrintTree(BiTNode *bt,int i) if(bt!=NULL) PrintTree(bt-right,i+5); #if CHAR if(bt-data!=Nil) printf(%*cn,i,bt-data); #else if(bt-data!=Nil) printf(%*dn,i,bt-data); #endif PrintTree(bt-left,i+5); i=
8、i-5; void Prorder1(BiTNode *bt,void(*visit)(TElemType)/*先序遍历*/if(bt!=NULL) visit(bt-data); Prorder1(bt-left,visit); Prorder1(bt-right,visit); void Prorder2(BiTNode *bt,void(*visit)(TElemType)/*中序遍历*/BiTNode *p,*stackMAS; int top; top=0; p=bt; while(top!=0|p!=NULL) while(p!=NULL) stacktop=p; top+; p=
9、p-left; if(top!=0) p=stacktop-1; top-; visit(p-data); p=p-right; void Prorder3(BiTNode *bt,void(*visit)(TElemType)/*后序遍历*/BiTNode *p,*stackMAS; int top; top=0; stacktop=bt; top+; while(top0) p=stacktop-1; top-; while(p!=NULL) visit(p-data); stacktop=p-right; top+; p=p-left; void visit(TElemType e)pr
10、intf(form ,e);int SumLefts(BiTNode *bt,int sum) if (bt!=NULL) if (bt-left=NULL & bt-right=NULL) printf(%4c,bt-data); sum+; sum=SumLefts(bt-left,sum); sum=SumLefts(bt-right,sum); return(sum);int SumTree(BiTNode *bt)static int sum=0; if(bt!=NULL) printf(%4c,bt-data); sum+; sum=SumTree(bt-left); sum=Su
11、mTree(bt-right); return(sum);BiTNode *Findchar(BiTNode *bt,char ch) /*二叉树查找结点*/BiTNode *p; /*利用函数名返回结果*/ if(bt!=NULL) if(bt-data=ch) p=bt; p=Findchar(bt-left,ch); p=Findchar(bt-right,ch); if(p!=NULL) return(p); else return(NULL);void main() int j,i,a,sum=0; BiTree bt; bt=InitBiTree(bt); #if CHAR pri
12、ntf(请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)n); #else printf(请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)n); #endif bt=CreateBiTree(bt); printf(输入建立的二叉树!n); PrintTree(bt,5); do printf(-); printf(n 主菜单); printf(n 1 二叉树先序遍历); printf(n 2 二叉树后序遍历); printf(n 3 二叉树中序遍历); printf(n 4 二叉树叶子结点数); printf(n 5 二叉树结点数); pri
13、ntf(n 6 二叉树查找x结点); printf(n 0 退出); printf(n-); printf(n); printf(输入你要选择的数据:); scanf(%d,&i); switch(i) case 1: printf(先序遍历结果为:); Prorder1(bt,visit); break; case 2: printf(后序遍历结果为:); Prorder2(bt,visit); break; case 3: printf(中序遍历结果为:); Prorder3(bt,visit); break; case 4: j=SumLefts(bt,sum); printf(树的叶子结点数为%d:,j); break; case 5: j=SumTree(bt); printf(树的结点数为%d:,j); break; case 6: printf(输入要查找的结点字符x:); scanf(%c,&a); scanf(%*c); / j=Findchar(bt,a); printf(要查找的结点的指针为%d:,j); break; case 0: exit(0); printf(n); / getch(); while(i0|i8);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1