二叉树的基本操作及其应用
![二叉树的基本操作及其应用](https://img.360docs.net/img31/01hluqh2uqa1n889jlct-11.webp)
![二叉树的基本操作及其应用](https://img.360docs.net/img31/01hluqh2uqa1n889jlct-a2.webp)
广西工学院计算机学院
《数据结构》课程实验报告书
实验六二叉树的基本操作及其应用
学生姓名:
学号:
班级:
指导老师:
专业:计算机学院软件学院
提交日期:2013年6月22日
1.实验目的
1)了解二叉树的特点、掌握二叉树的主要存储结构。
2)掌握二叉树的基本操作,能针对二叉树的具体应用选择相应的存储结构。
3)掌握递归算法的设计方法。
2.实验内容
(1)二叉链表表示二叉树,建立一棵二叉树,实现下列基本操作,通过数据测试每个操作的正确性,包括:
1. CreateBinTree(&T):建立一颗二叉树:。
2. BinTreeEmpty(T): 判断一棵二叉树是否为空树。
3. PreOrderTraverse(T): 先序遍历二叉树T,并输出节点序列。
4. InOrderTraverse(T): 中序遍历二叉树T,并输出节点序列。
5. PostOrderTraverse(T):后序遍历二叉树T,并输出节点序列。
6. LevelOrderTraverse(T):层次遍历二叉树T,并输出节点序列。
7. Value(T,e):查找值为e的节点,并返回该节点的地址。
8. BinTreeDepth(T):返回二叉树的深度。
9. Parent(T,e):查找二叉树T中值为e的节点的双亲,若e为根节点,操作失
败。(流程图)
10. LeftChild(T,e):查找二叉树T中值为e的节点的左孩子,若e没有左孩子,
则操作失败。(流程图)
11.RightChild(T,e):查找二叉树T中值为e的节点的右孩子,若e没有右孩子,
则操作失败。
12. CountNode(T):计算二叉树中节点的个数。
13. Leaf(T): 计算二叉树中叶子节点的个数。
14. OneChild(T): 计算二叉树中度为1的节点个数。
3.实验要求
(1)上机前交实验源程序(纸质版),由学习委员统一收好交老师(附上不交同学名单)。
(2)用一切你能想到的办法解决遇到的问题,培养解决问题的能力。
(3)实验课上进行答辩。
(4)实验报告当场交。报告内容包括:实验目的、实验内容、实验代码、实验运行结果以及实验体会供五部分。
3.主要算法
3.1 顺序存储结构
(1)结构定义:
#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;//定义宏参
//二叉树链表的类型定义
typedef struct BiTNode
{
TElemType data;//二叉树元素元素类型定义
struct BiTNode *lchild,*rchild;//定义左右孩子指针}BiTNode,*BinTree;
typedef BinTree ElemType;//队列元素类型定义
//定义链式队列类型
typedef struct QNode
{
ElemType data;//元素类型定义
struct QNode *next;//指向下个结点
}QNode,*QueuePtr;
////队列指针定义
typedef struct
{
QueuePtr front;//队列头指针
QueuePtr rear;//队列尾指针
}QUEUE;
//先序建立二叉树
void CreateBinTree(BinTree &T)
{//初始条件:二叉树不存在
//操作结果:建立一棵二叉树,二叉链表的数据域类型待定
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
T=(BinTree)malloc(sizeof(BiTNode));//建立头结点
if(!T)
exit(0);
T->data=ch;
CreateBinTree(T->lchild);
CreateBinTree(T->rchild);
}
return;
}
//清空二叉树
void ClearBinTree(BinTree &T)
{//初始条件:二叉树已存在
//操作结果:将链表都赋值为空
if(T)
{
T->data=' ';//赋域空值
ClearBinTree(T->lchild);
ClearBinTree(T->rchild);
}
return;
}
//判断空二叉树
int BinTreeEmpty(BinTree T)
{//初始条件:二叉树已存在
//操作结果:若空返回值1,反之返回0
if(!T)
return 1;
else
return 0;
}
//先序遍历二叉树
void PreorderTraverse(BinTree T) {//初始条件:二叉树已存在
//操作结果:先序递归遍历T
if(T)
{
printf("%c",T->data);
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
}
return;
}
//中序遍历二叉树
void InorderTraverse(BinTree T) {//初始条件:二叉树已存在
//操作结果:中序递归遍历T
if(T)
{
InorderTraverse(T->lchild);
printf("%c",T->data);
InorderTraverse(T->rchild);
}
return;
}
//后序遍历二叉树
void PostorderTraverse(BinTree T) {//初始条件:二叉树已存在
//操作结果:后序递归遍历T
if(T)
{
PostorderTraverse(T->lchild);
PostorderTraverse(T->rchild);
printf("%c",T->data);
}
return;
}
//初始化链式队列
void InitQueue(QUEUE *q)
{//初始条件:队列不存在
//操作结果:建立一个队列
q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));//建立头尾结点if(!(q->front))//头结点指向NULL
exit(0);
q->front->next=NULL;
}
//销掉链式队列
void DestroyQueue(QUEUE *q)
{//初始条件:队列已存在
//操作结果:销掉链式队列
while(q->front)//头结点还没指向NULL
{
q->rear=q->front->next;
free(q->front);
q->front=q->rear;
}
}
//判断空队列
int QueueEmpTy(QUEUE q)
{//初始条件:队列已存在
//操作结果:若为空队列返回1,否则返回0
if(q.front==q.rear)//头指针等于尾指针
return 1;
else
return 0;
}
//入队列
void EnQueue(QUEUE *q ,ElemType e)
{//初始条件:队列已存在
//操作结果:元素e从队尾入队
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));//建立新结点p if(!p)
exit(0);
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
//出队列
void DeQueue(QUEUE *q,ElemType *e)
{//初始条件:队列已存在
//操作结果:元素e从队头输出
QueuePtr p;
if(q->rear!=q->front)//头指针不等于尾指针
{
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
}
}
//层次遍历二叉树
void LevelTraverse(BinTree T)
{ //初始条件:二叉树已存在
//操作结果:层次递归遍历T
QUEUE q;
BinTree a;
if(T)
{
InitQueue(&q);//初始化链式队列
EnQueue(&q,T);//入队列
while(!QueueEmpTy(q))
{
DeQueue(&q,&a);//出队列
printf("%c",a->data);
if(a->lchild)//有左孩子
EnQueue(&q,a->lchild );
if(a->rchild )//有右孩子
EnQueue(&q,a->rchild );
}
}
return;
}
//查找值为e的节点
BinTree value(BinTree T, TElemType e)
{//初始条件:二叉树已存在
//操作结果:返回二叉树T中指向元素值为e的结点的指针QUEUE q;
BinTree a;
if(T)
{
InitQueue(&q);//初始化链式队列
EnQueue(&q,T);//入队列
while(!QueueEmpTy(q))
{
DeQueue(&q,&a);//出队列
if(a->data ==e)
return a;
if(a->lchild)//有左孩子
EnQueue(&q,a->lchild );
if(a->rchild )//有右孩子
EnQueue(&q,a->rchild );
}
}
return NULL;
}
//计算二叉树的深度
int BinTreeDepth(BinTree T)
{//初始条件:二叉树已存在
//操作结果:输出二叉树的深度
int i,j;
if(!T)
return 0;
i= BinTreeDepth(T->lchild);
j=BinTreeDepth(T->rchild);
return i>=j?i+1:j+1;
}
//查找值为e的节点的双亲
BinTree Parent(BinTree T,TElemType e)
{//初始条件:二叉树已存在
//操作结果:返回二叉树T中指向元素值为e的结点的双亲的指针QUEUE q;
BinTree a;
if(T)
{
InitQueue(&q);//初始化链式队列
EnQueue(&q,T);//入队列
while(!QueueEmpTy(q))
{
DeQueue(&q,&a);//出队列
if(a->lchild&&a->lchild->data==e||a->rchild&&a->rchild->data==e) return a;
else
{
if(a->lchild)//有左孩子
EnQueue(&q,a->lchild );
if(a->rchild )//有右孩子
EnQueue(&q,a->rchild );
}
}
}
return NULL;
}
//查找值为e的节点的左孩子
BinTree Leftchild(BinTree T,TElemType e)
{//初始条件:二叉树已存在
//操作结果:返回二叉树T中指向元素值为e的结点的左孩子的指针
BinTree p;
p=value(T,e);
if(p)
if(p->lchild)
return p->lchild;
else
return NULL;
return NULL;
}
//查找值为e的节点的右孩子
BinTree Rightchild(BinTree T,TElemType e)
{//初始条件:二叉树已存在
//操作结果:返回二叉树T中指向元素值为e的结点的右孩子的指针BinTree p;
p=value(T,e);
if(p)
if(p->rchild)
return p->rchild;
else
return NULL;
return NULL;
}
//计算二叉树中节点的个数
int CountNode(BinTree T)
{//初始条件:二叉树已存在
//操作结果:输出二叉树中节点的个数
static int sum=0;
if(NULL!=T)
{
++sum;
CountNode(T->lchild);
CountNode(T->rchild);
}
return sum;
}
//计算二叉树中叶子节点的个数
int Leaf(BinTree T)
{//初始条件:二叉树已存在
//操作结果:输出二叉树中叶子节点的个数
if(!T)
return 0;
if(!T->lchild&&!T->rchild)
return 1;
return Leaf(T->lchild)+Leaf(T->rchild);
}
//计算二叉树中度为1的节点个数
int Onechild(BinTree T)
{//初始条件:二叉树已存在
//操作结果:输出二叉树中度为1的节点个数
if(!T)
return 0;
if(T->lchild&&!T->rchild||!T->lchild &&T->rchild)
return 1+ Onechild(T->lchild)+ Onechild(T->rchild);
return Onechild(T->lchild)+ Onechild(T->rchild);
}
//主函数
{
BinTree t,p;
char e;
int j,k;
while(1)
{
system("cls");//清屏
printf("\n\t***************************************************");
printf("\n\t* 二叉树的基本操作及其应用*");
printf("\n\t***************************************************\n");
printf("\t * 1.建立二叉树 2.先序遍历*\n");
printf("\t * 3.中序遍历 4.后序遍历* \n");
printf("\t * 5.层次遍历 6.二叉树层数* \n");
printf("\t * 7.结点个数8.叶子结点数* \n");
printf("\t * 9.单孩子结点数10.查找结点左孩子*\n");
printf("\t * 11.查找结点右孩子12.查找结点双亲*\n");
printf("\t * 13.清空二叉树0.退出*\n");
printf("\t****************************************************\n");
printf("请选择选项<0-13>: ");
scanf(" %d",&k);
if(k<0||k>13)
{
printf("输入有误,请重新输入!");
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
continue;
}
switch(k)
case 1:
system("cls");//清屏
printf("按先序遍历建立一棵二叉树,输入相应的数据序号:\n");
printf("比如: AAA___A___\n");
printf("===================================================\n");
printf(" ( 1 )");
printf("\n");
printf(" / \\");
printf("\n");
printf(" ( 2 ) ( 4 )");
printf("\n");
printf(" / \\ / \\");
printf("\n");
printf(" ( 3 ) ( ) ( ) ( )");
printf("\n");
printf("====================================================\n");
printf("\n");
printf("你的输入为:");
CreateBinTree(t);
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 2:
printf("先序遍历二叉树的序列为:");
PreorderTraverse(t);//调用先序遍历函数
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 3:
printf("中序遍历二叉树的序列为:");
InorderTraverse(t);//调用中序遍历函数
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 4:
printf("后序遍历二叉树的序列为:");
PostorderTraverse(t);//调用后序遍历函数
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 5:
printf("层次遍历二叉树的序列为:");
LevelTraverse(t);//调用层次遍历函数
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 6:
printf("二叉树共有%d层!\n",BinTreeDepth(t));
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
printf("二叉树的结点数为:%d\n",CountNode(t));
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 8:
printf("二叉树的叶子结点数为:%d\n",Leaf(t));
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 9:
printf("二叉树的单孩子结点数为:%d\n",Onechild(t));
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 10:
printf("请输入要查找结点的值:");
e=getchar();
scanf("%c",&e);
p=Parent(t,e);
if(p)
printf("\n值为%c的结点的双亲结点的值为:%c",e,p->data);
else
printf("\n这结点无双亲!");
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
printf("请输入要查找结点的值:");
e=getchar();
scanf("%c",&e);
p=Leftchild(t,e);
if(p)
printf("\n值为%c的结点的左孩子结点的值为:%c",e,p->data);
else
printf("\n这结点无左孩子!");
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 12:
printf("请输入要查找结点的值:");
e=getchar();
scanf("%c",&e);
p= Rightchild(t,e);
if(p)
printf("\n值为%c的结点的右孩子结点的值为:%c",e,p->data);
else
printf("\n这结点无右孩子!");
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 13:
printf("你真确定要清空二叉树! 1.YES 2.NO\n");
printf("请选择项<1-2>: ");
scanf("%d",&j);
if(j==1)
ClearBinTree(t);
printf("二叉树清空成功呦!\n");
if(j==2)
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
case 0:
printf("你真确定要退出! 1.YES 2.NO\n");
printf("请选择项<1-2>: ");
scanf("%d",&j);
if(j==1)
exit(OVERFLOW);
else
printf("\n");
printf("\n\t\t\t按任意键进行重新操作!");
getch();
break;
}
}
}
实验三 二叉树的基本操作实现及其应用
二叉树的基本操作实现及其应用 一、实验目的 1.熟悉二叉树结点的结构和对二叉树的基本操作。 2.掌握对二叉树每一种操作的具体实现。 3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 4.会用二叉树解决简单的实际问题。 二、实验内容 设计程序实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 1 按先序次序建立一个二叉树, 2按(A:先序 B:中序 C:后序)遍历输出二叉树的所有结点 以上比做,以下选做 3求二叉树中所有结点数 4求二叉树的深度 三、实验步骤 ㈠、数据结构与核心算法的设计描述 /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct BitNode { DataType data; struct BitNode *lchild,*rchild; }*BitTree; 相关函数声明: 1、/* 初始化二叉树,即把树根指针置空 */ void BinTreeInit(BitTree *BT) { BT=(BitTree)malloc(sizeof(BitNode)); BT->data=NULL; cout<<"二叉树初始化成功!"<
二叉树的基本 操作
//二叉树的基本操作 #include 实验三二叉树的基本运算 一、实验目的 1、使学生熟练掌握二叉树的逻辑结构和存储结构。 2、熟练掌握二叉树的各种遍历算法。 二、实验内容 [问题描述] 建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目/叶结点数目;(选做) 4. 将二叉树每个结点的左右子树交换位置。(选做) [基本要求] 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立), [测试数据] 如输入:ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为 先序:ABCDEGF 中序:CBEGDFA 后序:CGEFDBA 层序:ABCDEFG [选作内容] 采用非递归算法实现二叉树遍历。 三、实验前的准备工作 1、掌握树的逻辑结构。 2、掌握二叉树的逻辑结构和存储结构。 3、掌握二叉树的各种遍历算法的实现。 一实验分析 本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。 二概要设计 功能实现 1.int CreatBiTree(BiTree &T) 用递归的方法先序建立二叉树, 并用链表储存该二叉树 2.int PreTravel(BiTree &T) 前序遍历 3. int MidTravel(BiTree &T) 中序遍历 4.int PostTravel(BiTree &T) 后序遍历 5.int Depth(BiTree &T) //计算树的深度 6.int howmuch(BiTree T,int h) 采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。 7. int exchang(BiTree &T) 交换左右子树,利用递归,当有左右孩子时才交换 三详细设计 #include 二叉树的基本操作及实现 二叉树的基本操作及实现的代码如下: #include 数据结构二叉树基本操作 (1). // 对二叉树的基本操作的类模板封装 //------------------------------------------------------------------------------------------------------------------------ #include 班级:数媒1101 学号:0305110125 课程名称:数据结构实验 实验名称:二叉树及其操作的实现 实验内容和目的: 内容:1. 创建二叉树; 2. 用递归方法实现二叉树的各种遍历。 目的:1.掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法; 2.掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍 历算法的递归实现和非递归实现。 实验步骤: 1.首先定义二叉树的存储形式; 2.用CreateBiTree( )构造二叉链表表示的二叉树T; 3. 用PreOrder ( bitree *t )、InOrder ( bitree *t)、PostOrder ( bitree * t )这三个函数 对二叉树依次进行先序、中序、后序遍历,并输出遍历序列。 实验代码/文件描述: #include "stdio.h" #include "stdlib.h" #define maxsize 64 #define null 0 typedef char datatype; typedef struct node { datatype data; struct node * lchild, * rchild; } bitree; bitree * bitr; bitree *Q[maxsize]; bitree *CREATREE( ) { char ch ; int front , rear ; bitree *root , *s ; root = null ; front = 1 ; rear = 0 ; ch = getchar( ) ; while ( ch != '#' ) { s = null ; if ( ch != '@' ) { s =(bitree*) malloc(sizeof(bitree)); s->data = ch ; s->lchild = null ;s->rchild =null; } rear ++; Q[rear] = s ; if (rear == 1 ) root = s ; else { if ( s && Q[front] ) if (rear%2==0 ) Q[front]->lchild = s ; else Q[front]->rchild = s ; if ( rear%2==1 ) front ++; } ch = getchar ( ) ; } return root ; } void PreOrder ( bitree *t ) { if ( t != null ) { printf("\t%c\n",t->data); PreOrder ( t->lchild ); PreOrder ( t->rchild ); } } void InOrder ( bitree *t) { if ( t != NULL ) { InOrder ( t->lchild ); printf("\t%c\n", t->data); InOrder ( t->rchild ); } } 实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境 PC微机 DOS操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:*(+)3 正确结果: 2、输入数据:(1+2)*3+(5+6*7); 正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的 形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示: 《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。 问题分析: 二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该: 1、建立二叉树; 2、通过递归方法来遍历(先序、中序和后序)二叉树; 3、通过队列应用来实现对二叉树的层次遍历; 4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等; 5、运用广义表对二叉树进行广义表形式的打印。 算法规定: 输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。 输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。 程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。 测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E 预测结果:先序遍历ABCDEGF 中序遍历CBEGDFA 后序遍历CGEFDBA 层次遍历ABCDEFG 广义表打印A(B(C,D(E(,G),F))) 叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2 查找5,成功,查找的元素为E 删除E后,以广义表形式打印A(B(C,D(,F))) 输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B 预测结果:先序遍历ABDEHCFG 中序遍历DBHEAGFC 后序遍历DHEBGFCA 层次遍历ABCDEFHG 广义表打印A(B(D,E(H)),C(F(,G))) 叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3 查找10,失败。 浙江大学城市学院实验报告 课程名称数据结构 实验项目名称实验十二叉树的基本操作 学生姓名专业班级学号 实验成绩指导老师(签名)日期 一.实验目的和要求 1、掌握二叉树的链式存储结构。 2、掌握在二叉链表上的二叉树操作的实现原理与方法。 3、进一步掌握递归算法的设计方法。 二.实验内容 1、按照下面二叉树二叉链表的存储表示,编写头文件binary_tree.h,实现二叉链表的定义与基本操作实现函数;编写主函数文件test10.cpp,验证头文件中各个操作。 二叉树二叉链表存储表示如下: typedef struct BiTNode { TElemType data ; struct BiTNode *lchild , *rchild ; }BiTNode,*BiTree ; 基本操作如下: ①void InitBiTree(BiTree &T ) //初始化二叉树T ②void CreateBiTree(BiTree &T) //按先序遍历序列建立二叉链表T ③bool BiTreeEmpty (BiTree T); //检查二叉树T是否为空,空返回1,否则返回0 ④int BiTreeDepth(BiTree T); //求二叉树T的深度并返回该值 ⑤void PreOrderTraverse (BiTree T); //先序遍历二叉树T ⑥void InOrderTraverse (BiTree T); //中序遍历二叉树T ⑦void PostOrderTraverse (BiTree T); //后序遍历二叉树T ⑧void DestroyBiTree(BiTree &T) //销毁二叉树T 实验四-二叉树操作实现 实验四二叉树操作实现 实验日期:2017 年 4 月20 日 实验目的及要求 1. 熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现; 2. 重点掌握二叉树的创建、遍历及求深度等算法; 3. 掌握运用递归方式描述算法及编写递归C程序的方法,提高算法分析和程序设计能力。 实验内容 键盘输入一个字符串,利用二叉树前序遍历的结果建成一棵二叉树,并用三种遍历方法打印,比较是否与自己预先想象的相一致。再求树的深度、1度结点数、2度节点数,交换二叉树的左右子树并输出交换后的中序遍历结果验证交换的正确性。找到二叉树中序遍历最后一个结点并输出结点值。 二叉树结点类型定义: typedef char datatype; typedef struct tnode{ datatype data; struct tnode *lchild,*rchild; } BiTNode,*BiTree; 任务 1.题目要求 创建一个程序文件sy4.cpp,自定义相应函数完成以下操作: (1)void visit(BiTree p) /*输出p指针指向的结点*/ (2)void Preorder(BiTree T) /*前序遍历*/ (3)void Inorder(BiTree T) /*中序遍历*/ (4)void Postorder(BiTree T) /*后序遍历*/ (5)BiTree CreateTree( ) /*以前序遍历的顺序建立二叉树*/ (6)int deep(BiTree T) /*求二叉树深度*/ (7)int leaf(BiTree T) /*求叶子结点数*/ (8)int OneChild(BiTree T) /*求1度结点数*/ (9)int TwoChild(BiTree T) /*求2度结点数*/ (10)void Exchange(BiTree T) /*二叉树左右子树交换*/ (11)BiTree InorderLastNode(BiTree T); /*找二叉树中序遍历最后一个结点*/ 2.请回答下列问题 (1)在n个结点二叉树的二叉链表存储中,其指针域的总数为2n 个,其中n-1 个用于链接孩子结点,n+1 个空闲着。 (2)在二叉链表存储中,数据域值为data,左右子树的指针分别为left和right,则判断: 指针p所指结点为0度结点的条件是p->left==NULL&&p->right==NULL ;指针p所指结点为1度结点的条件是(p->left==NULL&&p->right!=NULL)||(p->left!=NULL&&p->right==NULL) ; 指针p所指结点为2度结点的条件是p->left!=NULL&&p->right!=NULL 。(3)T为二叉树的根的地址,该树是空二叉树满足条件:T==NULL 。 3.sy14.cpp源程序清单(含必要的注释) #include 本程序由SOGOF完成 该完整程序主要是递归函数的使用及模板的使用,完成了对二叉树基本的链表操作,主要有二叉树的建立,前序、中序、后序遍历,求树的高度,每层结点数(包含树的最大宽度),左右结点对换,二叉树的内存释放,求解树的叶子数。 #include 数据结构程序报告(平衡二叉树的操作) 计算机科学学院数据结构课程设计报告 平衡二叉树操作 学生姓名: 学号: 班级: 指导老师: 报告日期: 1.需求分析 1.建立平衡二叉树并进行创建、查找、插入、删除等功能。 2.设计一个实现平衡二叉树的程序,可进行创建、查找、插入、删除等操作,实现动态的输入数据,实时的输出该树结构。 3.测试数据:自选数据 2.概要设计 1.抽象数据类型定义: typedef struct BSTNode { int data; int bf; //节点的平衡因子 struct BSTNode *lchild,*rchild; //左右孩子指针 }BSTNode,*BSTree; void CreatBST(BSTree &T); //创建平衡二叉树 void R_Rotate(BSTree &p); //对以*p 为根的二叉排序树作左旋处理 void L_Rotate(BSTree &p); //对以*p 为根的二叉排序树作左旋处理 void LeftBalance(BSTree &T); //对以指针T所指结点为根的二叉树作左平衡旋转处理void RightBalance(BSTree &T); //对以指针T所指结点为根的二叉树作右平衡旋转处理bool InsertA VL(BSTree &T,int e,bool &taller); //插入结点e bool SearchBST(BSTree &T,int key); //查找元素key是否在树T中 void LeftBalance_div(BSTree &p,int &shorter); void RightBalance_div(BSTree &p,int &shorter); 创作编号: GB8878185555334563BT9125XW 创作者:凤呜大王* //二叉树的基本操作 #include cout<<"--------------请选择------------"< 二叉树的创建与遍历 一、实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归和非递归方法编写对二叉树这种递归数据结构进行处理的算法。 二、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归和非递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历。 四、实验步骤 源程序代码1 #include 二叉树操作的实现 实验目的与要求: 1.基础知识:掌握数据结构中二叉树的相关知识;掌握C或VC++语言中程序设计的方法. 2.参考教材相关算法,完成以下程序功能: (1) 能够采用二叉链存储,并实现二叉树的建立; (2)完成已建立的二叉树的三种遍历; (3)完成二叉树中特定结点的统计,如0元素结点或叶子结点统计; (4)程序中有友好的操作设计. 实验性质:验证性(2学时) 说明:程序包含主要函数:主函数、操作界面、建树、独立的三种遍历、特定结点统计、相关注释,注意在主函数流程中体现先建树后遍历和特定结点统计的条件 #include int j=0; int *g=&j; void shuru(node*&t,char sn[50]) { char ch; ch=sn[j++]; if(ch=='@') printf("输入的二叉树有误建树失败\n"); else if(ch=='#')t=NULL; else { t=(node*)malloc(sizeof(node)); t->data=ch; shuru(t->lchild,sn); shuru(t->rchild,sn); }} void xianxu(node*&t) { if(t!=NULL) { printf("%c",t->data); xianxu(t->lchild); xianxu(t->rchild); }} void zhongxu(node*&t) { if(t!=NULL) { zhongxu(t->lchild); printf("%c",t->data); zhongxu(t->rchild); }} void houxu(node *&t) { if(t!=NULL) 实验五-二叉树基本操作的编程实现实验报告 ————————————————————————————————作者:————————————————————————————————日期: HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY 数据结构 实验报告 这里一定填 写清楚自己 实验项目实验五实验类别基础篇 学生姓名朱忠栋学生学号20120231515 完成日期2014-12-16 指导教师付勇智 实验成绩评阅日期 评阅教师 实验五二叉树基本操作的编程实现 【实验目的】 内容:二叉树基本操作的编程实现 要求: 二叉树基本操作的编程实现(2学时,验证型),掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数:2H) 【实验内容】 以下的选题都可以作为本次实验的推荐题目 1.建立二叉树,并以前序遍历的方式将结点内容输出。 2.将一个表示二叉树的数组结构转换成链表结构。 3.将表达式二叉树方式存入数组,以递归方式建立表达式之二叉树状结构,再分别输出前序、中序 及后序遍历结果,并计算出表达式之结果。 【注意事项】 1.开发语言:使用C。 2.可以自己增加其他功能。 【实验分析、说明过程】 页面不够,可续页。 根据自己选择的层次不同的实验内容,完善程序代码,调试通过后,分析说明该问题处理的详细算法过程。不需要写出详细的代码,只表达清楚详细的处理算法即可。可以采用流程图、形式语言或者其他数学表达方式来说明。 这次实验考查的主要是:递归建立二叉树,递归输出先序,中序和后序遍历的结果;非递归建立二叉树,再以非递归方式分别输出先序,中序和后序遍历的结果。 而对于基础篇考查的主要是:递归建立二叉树,递归输出先序,中序和后序遍历的结果,是以填空的方式进行考查的。 对于第一空:递归实现的先序遍历,其实现方法是: printf("%d",p->data); if(p->lchild!=NULL) preorder(p->lchild); if(p->rchild!=NULL) preorder(p->rchild); 对于第二空:递归实现的中序遍历,其实现方法是: if(p->lchild!=NULL) inorder(p->lchild); printf("%d",p->data); if(p->rchild!=NULL) inorder(p->rchild); 对于第三空:递归实现的后序遍历,其实现方法是: if(p->lchild!=NULL) postorder(p->lchild); if(p->rchild!=NULL) postorder(p->rchild); printf("%d",p->data); 【思考问题】 页面不够,可续页。 1.二叉树是树吗?它的定义为什么是递归的? 答:最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的树。具有n个结点的完全二叉树的深度为log2n +1 !!!二叉树的计算方法:若一棵二叉树为空,则其深度为0, 二叉树的基本操作实验报告 学号姓名实验日期 2012-12-26 实验室计算机软件技术实验指导教师设备编号 401 实验内容二叉树的基本操作 一实验题目 实现二叉树的基本操作的代码实现 二实验目的 1、掌握二叉树的基本特性 2、掌握二叉树的先序、中序、后序的递归遍历算法 3、通过求二叉树的深度、度为2的结点数和叶子结点数等算法三实习要求 (1)认真阅读书上给出的算法 (2)编写程序并独立调试 四、给出二叉树的抽象数据类型 ADT BinaryTree{ //数据对象D:D是具有相同特性的数据元素的集合。 //数据关系R: // 若D=Φ,则R=Φ,称BinaryTree为空二叉树; // 若D?Φ,则R={H},H是如下二元关系; // (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱; // (2)若D-{root}?Φ,则存在D-{root}={D1,Dr},且D1?Dr =Φ; // (3)若D1?Φ,则D1中存在惟一的元素x1, // (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。 //基本操作: CreateBiTree( &T, definition ) // 初始条件:definition给出二叉树T的定义。 // 操作结果:按definiton构造二叉树T。 BiTreeDepth( T ) // 初始条件:二叉树T存在。 // 操作结果:返回T的深度。 PreOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。 // 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操 作失败。 InOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。 // 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操 作失败。 PostOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。 // 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操 作失败。 LeafNodes(p) // 初始条件:二叉树T存在。 // 操作结果:返回T的叶子结点数。 郑州轻工业学院数据结构实验报告 题目 学生姓名 学号 专业班级 完成时间2016年月日 目录 一、系统功能介绍 (2) 二、需求分析 (2) 三、概要设计 (2) 四、详细设计 (5) 五、调试分析 (8) 六、使用说明 (8) 七、测试结果 (9) 八、心得体会 (10) 九、附录(程序代码) (11) 一、系统功能介绍 该系统主要功能是实现二叉树的定义和基本操作,包括定义二叉树的结构类型以及各个操作的具体函数的定义和主函数的定义。 各操作主要包括:初始化二叉树、按先序次序建立二叉树、检查二叉树是否为空、前序、中序、后序遍历树的方式、求树的深度、求树的结点数目、清空二叉树等九个对树的操作。 二、需求分析 本系统通过函数调用实现二叉树初始化,建立二叉树,检查树空与否,用前序、中序、后序遍历二叉树,求树的深度,求树的结点数目,清空二叉树等功能。 1)输出的形式和输出值的范围:在选择操作中,都以整型(数字)选择操作,插入和输出的数值都是char类型的字符; 2)输出的形式:在每次操作后,都会提示操作是否成功或者操作的结果; 3)程序达到的功能:完成初始化、检查是否为空、请空、遍历、求树的深度、求树的结点数目等功能; 4)测试数据设计: A,按先序次序建立二叉树。依次输入a,b,c,d,e,f,g.建立二叉树。 B,分别按先序,中序和后序遍历输出二叉树中的结点元素。 C,求树的高度和结点数。 三、概要分析 为了实现上述功能,定义二叉树的抽象数据类型。 ADT BinTree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D=¢,称BinTree为空二叉树 若D≠¢,则R={H},H是如下的二元关系; (1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2)若D-{root}≠¢,则存在D-{root}={D1,Dr},且D1∩Dr=¢; (3)若D≠¢,则中存在唯一的元素x1,二叉树的基本操作实验
二叉树的基本操作及实现.cpp
数据结构——二叉树基本操作源代码
二叉树及其操作的实现
数据结构实验二叉树
数据结构实验三——二叉树基本操作及运算实验报告
实验10 二叉树的基本操作
实验四-二叉树操作实现
二叉树基本操作经典实例
数据结构程序报告(平衡二叉树的操作)
二叉树的基本 操作
C++二叉树的创建与遍历实验报告
二叉树操作的实现
实验五-二叉树基本操作的编程实现实验分析报告
二叉树的基本操作实验报告
二叉树基本操作+数据结构+实验报告