数据结构实验报告三 二叉树
一、实验目的
1、掌握二叉树的基本特性
2、掌握二叉树的先序、中序、后序的递归遍历算法
3、理解二叉树的先序、中序、后序的非递归遍历算法
4、通过求二叉树的深度、叶子结点数和层序遍历等算法,理解二叉树的基本特性
二、实验内容和要求
1、阅读并运行下面程序,根据输入写出运行结果,并画出二叉树的形态。
#include<stdio.h>
#include<malloc.h>
#define MAX 20
typedef struct BTNode{ /*节点结构声明*/char data ; /*节点数据*/struct BTNode *lchild;struct BTNode *rchild ; /*指针*/
}*BiTree;BiTree createBiTree(BiTree t){ /* 先序遍历创建二叉树*/char s;printf("\nplease input data:(exit for #)");s=getchar();if(s=='#'){t=NULL; return t;}t=(BiTree)malloc(sizeof(struct BTNode));if(t==NULL){printf("Memory alloc failure!"); exit(0);}t->data=s;t->lchild=createBiTree(t->lchild); /*递归建立左子树*/t->rchild=createBiTree(t->rchild); /*递归建立右子树*/return t;
}void PreOrder(BiTree p){ /* 先序遍历二叉树*/if ( p!= NULL ) {printf("%c", p->data);PreOrder( p->lchild ) ;PreOrder( p->rchild) ;}
}
void InOrder(BiTree p){ /* 中序遍历二叉树*/if( p!= NULL ) {InOrder( p->lchild ) ;printf("%c", p->data);InOrder( p->rchild) ;}
}
void PostOrder(BiTree p){ /* 后序遍历二叉树*/if ( p!= NULL ) {PostOrder( p->lchild ) ;PostOrder( p->rchild) ;printf("%c", p->data);}
}void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/BiTree stack[MAX],q;int top=0,i;for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/q=p;while(q!=NULL){printf("%c",q->data);if(q->rchild!=NULL) stack[top++]=q->rchild;if(q->lchild!=NULL) q=q->lchild;elseif(top>0) q=stack[--top];else q=NULL;}
}void release(BiTree t){ /*释放二叉树空间*/if(t!=NULL){release(t->lchild);release(t->rchild);free(t);}
}int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);release(t);return 0;
}
运行程序
输入:
ABC##DE#G##F###
运行结果:
画出该二叉树的形态:
2、在上题中补充求二叉树中求结点总数算法(提示:可在某种遍历过程中统计遍历的结点数),并在主函数中补充相应的调用验证正确性。
算法代码:
int CountLeaf(BiTree T)
{if(T){return CountLeaf(T->lchild)+CountLeaf(T->rchild)+1;}elsereturn 0;
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;a=CountLeaf(t);printf("\n");printf("%d",a);release(t);return 0;
}
3、在上题中补充求二叉树中求叶子结点总数算法(提示:可在某种遍历过程中统计遍历的叶子结点数),并在主函数中补充相应的调用验证正确性。
算法代码:
void CountLeaf(BiTree T,int *count)
{if(T){if((!T->lchild)&&(!T->rchild))(*count)++;CountLeaf(T->lchild,count);CountLeaf(T->rchild,count);}
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;CountLeaf(t,&a);printf("\n");printf("%d",a);release(t);return 0;
}
4、在上题中补充求二叉树深度算法,并在主函数中补充相应的调用验证正确性。
算法代码:
int Depth(BiTree T)
{int hl,hr;if(!T)return 0;else{hl=Depth(T->lchild);hr=Depth(T->rchild);if(hl>=hr)return hl+1;elsereturn hr+1;}
}
int main(){BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);int a;printf("\n");printf("%d",Depth(t));release(t);return 0;
}
5、补充二叉树层次遍历算法。(提示:利用队列实现)
#include <stdio.h>
#include <stdlib.h>
typedef struct btnode
{char data;struct btnode *lchild,*rchild;
} bitree,*Bitree;
//链队列类型定义
typedef struct LinkQueueNode
{bitree *data;struct LinkQueueNode *next;
} LKQueNode;
typedef struct LKQueue
{LKQueNode *front,*rear;
} LKQue;//初始化队列
void InitQueue(LKQue *LQ)
{LKQueNode *p;p = (LKQueNode*)malloc(sizeof(LKQueNode));LQ->front = p;LQ->rear = p;LQ->front->next = NULL;
}//判断队列是否为空
int EmptyQueue(LKQue *LQ)
{if(LQ->front == LQ->rear)return 1;elsereturn 0;
}//入队列
void EnQueue(LKQue *LQ,Bitree x)
{LKQueNode *p;p = (LKQueNode*)malloc(sizeof(LKQueNode));p->data = x;p->next = NULL;LQ->rear->next = p;LQ->rear = p;
}//出队列
int OutQueue(LKQue *LQ)
{LKQueNode *s;if ( EmptyQueue(LQ)){exit(0);return 0;}else{s = LQ->front->next;LQ->front->next = s->next;if(s->next == NULL)LQ->rear = LQ->front;free(s);return 1;}
}//取队列首元素
Bitree GetHead(LKQue *LQ)
{LKQueNode *p;bitree *q;if(EmptyQueue(LQ))return q;else{p = LQ->front->next;return p->data;}
}//建二叉树
Bitree Initiate()
{char ch;Bitree t;ch = getchar();if(ch == '#')t = NULL;else{t = (Bitree)malloc(sizeof(bitree));t->data = ch;t->lchild = Initiate();t->rchild = Initiate();}return t;
}//层次遍历
void LevelOrder(Bitree bt)
{LKQue Q;Bitree p;InitQueue(&Q);if(bt != NULL){EnQueue(&Q,bt);while(!EmptyQueue(&Q)){p = GetHead(&Q);OutQueue(&Q);printf("%c",p->data); //输出是charif(p->lchild != NULL)EnQueue(&Q,p->lchild);if(p->rchild != NULL)EnQueue(&Q,p->rchild);}}
}
int main()
{Bitree T;printf("按先序序列输入结点序列,'#'代表空:\n");T=Initiate();printf("\n层次遍历序列为:");LevelOrder(T);printf("\n");return 0;
}
6、 补充二叉树中序、后序非递归算法。
#include<stdio.h>
#include<malloc.h>#define MAX 20
typedef struct BTNode /*节点结构声明*/
{char data ; /*节点数据*/struct BTNode *lchild;struct BTNode *rchild ; /*指针*/
}*BiTree;BiTree createBiTree(BiTree t) /* 先序遍历创建二叉树*/
{char s;printf("\nplease input data:(exit for #)");s=getchar();if(s=='#'){t=NULL;return t;}t=(BiTree)malloc(sizeof(struct BTNode));if(t==NULL){printf("Memory alloc failure!");exit(0);}t->data=s;t->lchild=createBiTree(t->lchild); /*递归建立左子树*/t->rchild=createBiTree(t->rchild); /*递归建立右子树*/return t;
}void PreOrder(BiTree p) /* 先序遍历二叉树*/
{if ( p!= NULL ){printf("%c", p->data);PreOrder( p->lchild ) ;PreOrder( p->rchild) ;}
}
void InOrder(BiTree p) /* 中序遍历二叉树*/
{if( p!= NULL ){InOrder( p->lchild ) ;printf("%c", p->data);InOrder( p->rchild) ;}
}
void PostOrder(BiTree p) /* 后序遍历二叉树*/
{if ( p!= NULL ){PostOrder( p->lchild ) ;PostOrder( p->rchild) ;printf("%c", p->data);}
}void Preorder_n(BiTree p) /*先序遍历的非递归算法*/
{BiTree stack[MAX],q;int top=0,i;for(i=0; i<MAX; i++) stack[i]=NULL; /*初始化栈*/q=p;while(q!=NULL){printf("%c",q->data);if(q->rchild!=NULL) stack[top++]=q->rchild;if(q->lchild!=NULL) q=q->lchild;else if(top>0) q=stack[--top];else q=NULL;}
}void release(BiTree t) /*释放二叉树空间*/
{if(t!=NULL){release(t->lchild);release(t->rchild);free(t);}
}
void InordeTraverse(BiTree bt)
{BiTree stack[100], p;int top=0;p=bt;do{while(p!=NULL){stack[top++]=p;p=p->lchild;}if(top>0){p=stack[top-1];printf("%c",stack[top-1]->data);top--;p=p->rchild;}}while(top!=0||p!=NULL);
}/*中序遍历非递归算法*/
void PostorderTraverse(BiTree bt)
{BiTree stack[MAX];int top1 = 0;BiTree cur,top,last = NULL;cur = bt;for(int i = 0; i < MAX; i++)stack[i] = NULL;while(cur || top1){while(cur){stack[++top1] = cur;cur = cur->lchild;}top = stack[top1];if(top->rchild == NULL || top->rchild == last){top1--;printf("%c",top->data) ;last = top;}else{cur = top->rchild;}}
}int main()
{BiTree t=NULL;t=createBiTree(t);printf("\n\nPreOrder the tree is:");PreOrder(t);printf("\n\nInOrder the tree is:");InOrder(t);printf("\n\nPostOrder the tree is:");PostOrder(t);printf("\n\n先序遍历序列(非递归):");Preorder_n(t);printf("\n\n中序遍历序列(非递归):");InordeTraverse(t);printf("\n\n后序遍历序列(非递归):");PostorderTraverse(t);release(t);return 0;
}
数据结构实验报告三 二叉树相关推荐
- 数据结构实验报告,二叉树的基本操作(C语言)
数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...
- 二叉树的遍历(c语言数据结构实验报告三)
二叉树的遍历 一.实验目的或任务 二.实验教学基本要求 三.实验教学的内容或要求 1. 编写函数,输入字符序列,建立二叉树的二叉链表 2. 编写函数,实现二叉树的中序递归遍历算法. 3. 编写函数,实 ...
- 数据结构实验报告三:教材3.10Josephus(约瑟夫环)问题、多项式乘法问题的求解
实验三:教材3.10Josephus(约瑟夫环)问题.多项式乘法问题的求解 问题一·教材3.10Josephus问题 1.实验描述 N个人从1到N编号,围坐成一个圆圈.从1号开始传递一个热土豆.经过M ...
- C语言南邮数据结构实验报告2,南邮数据结构实验报告.docx
南邮数据结构实验报告 实验报告 课程名称 实验名称数据结构二叉树基本操作以及哈夫曼编码译码系统 实验时间 指导单位指导教师年月日 学生姓名 学院(系) 班级学号专业 二叉树的基本运算: 一.问题描述 ...
- 桂电七院数据结构实验报告一
顺序表的基本操作 实验内容与步骤 实现顺序表上的插入.删除等操作.调试程序并对相应的输出作出分析:修改输入数据,预期输出并验证输出的结果.加深对有关算法的理解. 步骤: 第一步:定义顺序表的存储结构. ...
- 数据结构实验报告(六)
数据结构实验报告(六) 一.实验名称 实验六 图的实验1--图的邻接矩阵存储实现 二. 实验目的 1. 熟练理解图的相关概念: 2. 掌握图的邻接矩阵的存储方法的实现: 3. 学会图的遍历算法 ...
- 农夫过河【数据结构实验报告】
数据结构实验报告 实验名称:实验三 农夫过河 学号:*** 姓名:gnosed 实验日期:2017.10.30 一.实验目的 1.进一步掌握队列的使用 2.会使用队列进行农夫过河解的搜索 二.实验具体 ...
- 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四
北京理工大学数据结构实验报告实验四 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 <数据结构与算法设计>实验报告--实 ...
- 数据结构实验报告(一)
数据结构实验报告(一) 一.实验名称 实验一 线性表的基本操作实现及其应用 二.实验目的 1.熟练掌握线性表的结构特点,掌握顺序表的基本操作. 2.巩固 C++相关的程序设计方法与技术. 3.学会使 ...
最新文章
- 解密ATS 4.2.3的缓存状态密码
- hadoop中的序列化与Writable类
- HP QC IE11不支持( win7 64位 无法安装)解决方法
- hibernate实体的几种状态
- [WPF]程序随系统自启动
- FlexPaper 2.2.1介绍与提取嵌入的文档
- 进程锁 读写文件的小例子 C++代码
- Linux 中文无法显示或显示方块
- 青蛙换位java_青蛙换位
- C#:const 和readonly的区别
- kubernetes视频教程笔记 (35)-使用Helm部署metrics-server
- Windows10删除hiberfil.sys
- Java 设计员工类Employee,假设现有教师、科学家2种员工类型,根据要求求出各人的全年收入。
- 《数据之美》读书笔记
- 《乔布斯转》读书笔记
- 油罐车起火造成损失和伤亡?资产监测设备可远程监测油罐车运输!
- python里raise是什么意思_python raise有什么用
- 『阶段总结』研一目标
- [转] 找到一个与VR相关的博客
- 几篇人工智能/思考的书籍