版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 验 项 目二叉树的操作项 目 类 型综合型完 成 时 间2009-11-2实 验 目 的及 要 求掌握二叉树的存储实现; 掌握二叉树的遍历思想; 掌握二叉树的常见算法的程序实现。【实验过程】(实验步骤、绘图、记录、数据、分析、结果)实验内容:a.输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD#CE#F# 建立二叉树,实现先序、中序和后序以及按层次遍历序列。b. 求所有叶子及结点总数。实验步骤:#include #include #define MAX 10#define STACK_INIT_SIZE 40 /存储空间初始分配量#define STACKINCREMENT 1
2、0 /存储空间分配增量typedef struct BiTNodechar data;struct BiTNode *lchild;struct BiTNode *rchild;BiTNode,*BiTree;/将BiTree定义为指向二叉链表结点结构的指针类型BiTNode *bt;typedef struct BiTree *base; int top; int stacksize;SqStack; typedef structBiTree *base;int front;int rear;SqQueue; void InitStack(SqStack &S)/ 构造一个空栈S S.bas
3、e=(BiTree*) malloc(STACK_INIT_SIZE*sizeof(BiTree); if (!S.base) exit (0); /存储分配失败 S.top=0; /空表长度为0 S.stacksize=STACK_INIT_SIZE; /初始存储容量/InitStackint StackEmpty(SqStack &S)/ 判断栈S是否是空栈,是返回1,否则返回0 if(S.top=0) return 1; else return 0;/StcakEmptyvoid Push(SqStack &S, BiTree e)/ 插入元素e为新的栈顶元素, if (S.top=S.
4、stacksize) /栈满追加空间 S.base=(BiTree*) realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree); if(!S.base) exit(0);/存储分配失败 S.stacksize+=STACKINCREMENT; S.baseS.top+=e;/Pushvoid Pop(SqStack &S,BiTree &e) /若栈不空则删除S的栈顶元素,并用e返回其值 if (S.top=0) printf(栈空); /栈为空exit(0);e=S.base-S.top;/Popint GetTop(SqStac
5、k S, BiTree &e) /若栈不空则用e返回S的栈顶元素 if (S.top=0) printf(栈空); return 0;/栈为空 else e=S.baseS.top-1; return 1; /GetTopvoid InitQueue(SqQueue &Q)/构建新队列QQ.base=(BiTree*)malloc(MAX * sizeof(BiTree);Q.front=Q.rear=0;int QueueEmpty(SqQueue Q)/判断队列是否是一个空队列if(Q.front=Q.rear)return 1;return 0;void EnQueue(SqQueue
6、&Q,BiTree e)/将元素e插入到队列Q中if(Q.rear+1)%MAX=Q.front)exit(0);Q.baseQ.rear=e;Q.rear=(Q.rear+1)%MAX;void DeQueue(SqQueue &Q,BiTree &e)/将非空队列Q的队头元素出队列if(Q.front=Q.rear)exit(0);e=Q.baseQ.front;Q.front=(Q.front+1)%MAX;/int n0,n;/n0统计叶子结点数,n统计总的结点数void PreCreatBiTree(BiTree &bt)/按照先序建立二叉树的二叉链表#表示虚结点char ch;ch
7、=getchar();if(ch=#)bt=NULL;elsebt=(BiTree)malloc(sizeof(BiTNode);bt-data=ch; PreCreatBiTree(bt-lchild);PreCreatBiTree(bt-rchild);void InOrderTraverse1(BiTree bt)/利用递归算法中序遍历一个二叉树if(bt)InOrderTraverse1(bt-lchild);printf(%2c,bt-data); InOrderTraverse1(bt-rchild);void PreOrderTraverse1(BiTree bt)/递归算法对二
8、叉树进行先序便利if(bt)printf(%2c,bt-data);PreOrderTraverse1(bt-lchild);PreOrderTraverse1(bt-rchild);void PostOrderTraverse1(BiTree bt)/利用递归后序遍历二叉树if(bt)PostOrderTraverse1(bt-lchild);PostOrderTraverse1(bt-rchild); printf(%2c,bt-data);void LeverlOrderTraverse(BiTree bt)/层次遍历二叉树 SqQueue Q;BiTree p;if(bt) InitQ
9、ueue(Q);EnQueue(Q,bt);while(!QueueEmpty(Q)DeQueue(Q,p);printf(%2c,p-data);if(p-lchild)EnQueue(Q,p-lchild);if(p-rchild)EnQueue(Q,p-rchild);/while/if/LeverlOrderTraversevoid PreOrderTraverse2(BiTree bt)/非递归对bt进行先序遍历SqStack S;BiTree p; if(bt) InitStack(S); Push(S, bt);/根指针进栈 while(!StackEmpty(S) while(
10、GetTop(S,p) & p) printf(%2c,p-data); Push(S, p-lchild); /向左一直走到尽头 Pop(S,p); /空指针退栈 if(!StackEmpty(S) Pop(S,p); Push(S, p-rchild); /while /if/ PreOrderTraversevoid InOrderTraverse2(BiTree bt)/非递归对bt进行中序遍历 if(bt) SqStack S; BiTree p; InitStack(S); Push(S, bt); /根指针进栈 while(!StackEmpty(S) while(GetTop(
11、S,p)&p)/栈顶元素非空 Push(S, p-lchild); /向左一直走到尽头 Pop(S, p); /空指针退栈 if(!StackEmpty(S)Pop(S,p); printf(%2c,p-data); Push(S, p-rchild); /if /while /if/ InOrderTraversevoid PostOrderTraverse2(BiTree bt) /非递归对bt进行后序遍历 SqStack S; BiTree p,q; InitStack(S); Push(S,bt);/根指针进栈 while(!StackEmpty(S) while(GetTop(S,p
12、)&p) /栈顶元素非空 Push(S,p-lchild); /向左一直走到尽头Pop(S,p); /空指针退栈 /对左子树操作完毕,再判断右子树 if(!StackEmpty(S)/栈非空 GetTop(S,p); Push(S,p-rchild);/右孩子入栈 if(GetTop(S,p)&p=NULL) Pop(S,p); /空结点出栈 Pop(S,p); /左右孩子处理完了 printf(%2c,p-data);/访问根结点 while(!StackEmpty(S)&GetTop(S,q)&q-rchild=p)/并且刚刚访问的结点为栈顶元素的右孩子时,让栈顶元素出栈并访问他 Pop(
13、S,p); printf(%2c,p-data); if(! StackEmpty (S) GetTop(S,p); Push(S,p-rchild); /if /if /PostOrderTraversevoid PutOutLeaf(BiTree bt)/返回值为bt的叶子数if(bt)if(bt-lchild=NULL&bt-rchild=NULL)printf(%2c,bt-data);elseif(bt-lchild) PutOutLeaf(bt-lchild);if(bt-rchild) PutOutLeaf(bt-rchild);void CountNodes(BiTree bt
14、,int &n)/输出总的节点数if(bt)n+;CountNodes( bt-lchild,n);CountNodes( bt-rchild,n);void main() int n=0;printf(先序建立二叉树,#代表虚结点n);printf(请输入你所建立二叉树的字符串n);PreCreatBiTree(bt);printf(n);printf(先序遍历二叉树递归算法n); PreOrderTraverse1(bt);printf(n先序遍历二叉树非递归算法n);PreOrderTraverse2(bt); printf(n中序遍历二叉树递归算法n);InOrderTraverse1(bt);printf(n中序遍历二叉树非递归算法n);InOrderTraverse2(bt);printf(n后序遍历二叉树递归算法n);Post
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年历史文化保护岗遴选试题及答案
- 数据中心电源故障切换阶段电力工程师预案
- 采购申请审批流程标准化工具供应商管理版
- 企业运营承诺书示例(5篇)
- 项目效果评估与改进方案模板
- 就2026年项目预算调整的商讨函(4篇)
- 高效管理谋发展的承诺书(7篇)
- 银行理财产品收益计算与评估方案
- 申请新增办公设备申请函(4篇)范文
- 汽车维护与管理技术手册
- 2026广东深圳市优才人力资源有限公司公开招聘聘员(派遣至龙城街道)18人备考题库附答案详解(精练)
- 2026年黄山职业技术学院单招职业倾向性考试题库含答案详解(培优b卷)
- 2026年常州纺织服装职业技术学院单招职业技能考试题库附参考答案详解(夺分金卷)
- 索赔业务管理制度及流程
- 2026年大象版二年级科学下册(全册)教学设计(附目录)
- 矿山安全部管理制度
- 生产车间质量红线制度标准
- 2026年春季学期学校安全工作计划-守好一校之安护好一日之常
- 2025中国电科29所校园招聘笔试历年难易错考点试卷带答案解析2套试卷
- 纳米材料与食品安全课件
- 房车改装采购合同范本
评论
0/150
提交评论