《程序设计实践》实验报告 - 二叉树-
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学院
实践课程设计
题目二叉树
学院工程技术学院
专业计算机科学与技术
班级计算机1701班
姓名
指导教师
2019 年月日
一、实验目的
掌握二叉树的定义、基本操作,综合应用所学的知识分析问题、解决问题,学会用建立二叉树并对其进行遍历,提高实际编程能力及程序调试能力。
二、实验要求
建立二叉树,并进行遍历(前序遍历、中序遍历、后序遍历、层次遍历)。
三、实验方法内容
1.算法设计思路
二叉树的非递归遍历是用显示栈来储存二叉树的节点指针,先序遍历时,按二叉树的前序遍历的顺序访问接点,并将结点指针入栈,直到栈顶指针指向结点的左指针域为空时取出栈顶指针并删除栈顶指针,访问刚取出的指针指向的结点的右指针指向结点并将其指针入栈,如此反复执行则为非递归操作。
二叉树的递归遍历:若二叉树为空,则空操作
先序遍历:
(a)访问根结点;
(b)先序遍历左子树;
(c)先序遍历右子树。
中序遍历:
(a)中序遍历左子树
(b)访问根结点;
(c)中序遍历右子树。
后序遍历:
(a)后序遍历左子树
(b)后序遍历右子树
(c)访问根结点;
层次遍历:
从二叉树第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
2.算法中用到的数据结构
(1)void CreateBiTree 以二叉链表表示二叉树,建立一棵二叉树;
(2)void PreOrderTraverse 输出二叉树的前序遍历结果;
(3)void InOrderTraverse 输出二叉树的中序遍历结果;
(4)void PostOrderTraverse 输出二叉树的后序遍历结果;
(5)int LeafNodeCount 统计二叉树的叶结点个数;
(6)int Node Count 统计二叉树的结点个数;
(7)int Depth 计算二叉树的深度。
(8)int Swap 交换二叉树每个结点的左孩子和右孩子;
3.主要的常量变量
void CreateBiTree
void PreOrderTraverse
void InOrderTraverse
void PostOrderTraverse
int LeafNodeCount
int NodeCount
int Depth
int Swap
四、实验代码
#include
#include
#define MAX 100
//二叉树结构定义
typedef struct node
{
char data;
struct node *lchild,*rchild;
}binnode;
typedef binnode *bintree;
typedef struct Qnode *Queue;
//队列结构定义
struct Qnode{
bintree data[MAX];
int front;
int rear;
};
//判断队列是否为空
int IsQueue(Queue Q){
if(Q->front==Q->rear)
return 0;
else return 1;
}
//定义一个队列并初始化
Queue CreateEmptyQueue(){
Queue Ptrq;
Ptrq=(Queue)malloc(sizeof(struct Qnode));
Ptrq->front=0;
Ptrq->rear=0;
return Ptrq;
}
//入队
void EnQueue(Queue *Ptrq,bintree t){
if((((*Ptrq)->rear)+1)%MAX==(*Ptrq)->front)
{
printf("队满\n");
}
else{
(*Ptrq)->data[((*Ptrq)->rear)++]=t;
(*Ptrq)->rear=((*Ptrq)->rear)%MAX;
}
}
//出队
bintree DeQueue(Queue *Ptrq){
bintree t;
if((*Ptrq)->front==(*Ptrq)->rear)
{
printf("队空\n");
return NULL;
}
else{
t=(*Ptrq)->data[(*Ptrq)->front];
(*Ptrq)->front=((*Ptrq)->front+1)%MAX;
return t;
}
}
//先序递归创建二叉树
void creatbintree(bintree *t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
*t=NULL;
else
{
*t=(bintree)malloc(sizeof(binnode));
(*t)->data=ch;
creatbintree(&(*t)->lchild);
creatbintree(&(*t)->rchild);
}
}
//前序递归遍历二叉树
void preorder(bintree t)
{
if (t)
{