数据结构-课程设计报告二叉排序树的实现

课程设计

课程名称数据构造课程设计

题目名称二叉排序树的实现

学院应用数学学院

专业班级

学号

学生XX

指导教师

2013 年12 月26 日

1.设计任务

1)实现二叉排序树,包括生成、插入,删除;

2)对二叉排序树进展先根、中根、和后根非递归遍历;

3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信

息(至少包括学号、XX、成绩3项),比照查找效率,并说明

为什么二叉排序树效率高〔或者低〕。

2. 函数模块:

2.1.主函数main模块功能

1.通过bstree CreatTree()操作建立二叉排序树。

2.在二叉排序树t中通过操作bstree InsertBST(bstree t,int

key,nametype name,double grade)插入一个节点。

3. 从二叉排序树t中通过操作void Delete(bstree &p)删除任意节点。

4. 在二叉排序树t中通过操作bstnode *SearchBST(bstree t,keytype key)查找节

点。

5. 在二叉排序树t中通过操作p=SearchBST(t,key)查询,并修改节点信息

6. 非递归遍历二叉排序树。

7. 定义函数void pare()对数组和二叉排序树的查找效率进展比拟比拟。

2.2创立二叉排序树CreatTree模块

从键盘中输入关键字及记录,并同时调用插入函数并不断进展插入。最后,返回根节点T。

2.3删除模块:

二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。假设二叉排序树上删除节点为*p〔指向节点的指针为p〕,其双亲节点为*f〔节点指针为f〕。假设*p节点为叶子节点,那么即左右均为空树,由于删去叶子节点不破坏整棵树的构造,那么只需修改其双亲节点的指针即可;假设*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;假设*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱〔或直接后继〕替代*p,然后再从二叉排序树中删去它的直接前驱〔或直接后继〕。在二叉排序树中删除一个节点的算法为

void DeleteData(bstree &t,keytype key)

假设二叉排序树t中存在关键字等于key的数据元素,那么删除该数据元素节点,并返回TRUE,否那么返回FALSE。

2.4插入模块

二叉排序树是一种动态树表,其特点是树的构造通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进展插入。新插入的节点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个节点的左孩子或右孩子的节点。一个无序系列可以通过构造一棵二叉排序树而变成一个有序系列,构造树的过程即为对无序系列进展

排序的过程,并且每次插入的节点都是二叉排序树上新的叶子节点,那么在进展插入操作时,不必移动其他节点,仅需改变某个节点的指针由空变为非空即可。二叉排序树的插入算法为

bstree InsertBST(bstree t,int key,nametype name,double grade)

假设二叉排序树中不存在关键字等于key的数据元素时,插入元素并返回TRUE。

2.5查找模块

二叉排序树又称二叉查找树,当二叉排序树不为空时,首先将给定的值和根节点的关键字比拟,假设相等那么查找成功,否那么将依据给定的值和根节点关键字之间的大小关系,分别在左子树或右子树上继续进展查找。为此定义一个二叉排序树的查找算法为

bstnode *SearchBST(bstree t,keytype key)

在根指针t所指向的二叉排序树中查找关键字等于key的数据元素,如成功,返回指向该元素节点的指针,否那么返回空指针。

2.6效率比拟pare模块

void pare()对数组和二叉排序树的查找效率进展比拟比拟。

2.7二叉排序树的遍历

先序遍历也叫做先根遍历。首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空那么返回。其实过程为:先遍历左子树

root->left->left->left...->null,由于是先序遍历,因此一遇到节点,便需要立即访问;由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。其一可以用栈记忆在访问途中将依次

遇到的节点保存下来。根据栈的先进后出、后进先出的特点特点。那么可以用栈保存。每次都将遇到的节点压入栈,当左子树遍历完毕后从栈中弹出最后一个访问的节点,然后访问其右子树。

根本算法思想:

1.先访问根节点,将根节点入栈

2.重复执行两大步骤:如果该节点左孩子存在,那么访问该左孩子节点,并

将其指针入栈。重复以上操作,直到节点的左孩子不存在。将栈顶的元素,即其指针出栈,回到父节点,如果该指针节点的右孩子存在,那么将该指针指向的右孩子节点重复执行以上步骤,直到桟为空为止。

操作函数为void x_print(Tree T)

中序遍历:中序遍历和先序遍历访问的顺序不同。中序遍历访问顺序为中序遍历左子数,在访问根节点,最后中序遍历右子树。先序遍历是先访问,再入栈;而中序遍历那么是先入栈,弹栈后再访问。将二叉树的根节点入栈,如果该节点有左孩子,将左孩子直接入栈,重复该操作,直到该节点无左孩子;在将栈顶元素出栈,并访问该节点指向的节点,如果该指针指向的右孩子存在,那么将当前指针指向右孩子节点。重复执行步骤直到栈为空为止。操作函数为void z_print(Tree T )。

后序遍历:先后序遍历左子树,在后序遍历右子树,最后访问根节点。先将根节点入栈,如果该节点左孩子节点存在,将该节点左孩子节点入栈。重复执行此操作,直到节点左孩子节点为空。取栈顶元素,并赋值给P,如果P 的右孩子为空或P的右孩子等于q〔即如果p的右孩子已访问,那么访问根节点,即p指向的节点,并用q来记录刚刚访问的节点的指针〕,假设p有右孩

子,且右孩子没有别访问过,那么p=p->rchild。

操作函数为void h_print(Tree T)

3.源代码

#include

#include

#include

#include

#include

using namespace std;

typedef string nametype;

typedef unsigned long keytype;

typedef struct node //结点的构造体

{

keytype key;

nametype name;

int grade;

struct node *lchild,*rchild;

}bstnode;

typedef bstnode *bstree;

//栈的定义//

typedef struct{ //栈构造

bstree *base;

bstree *top;

int stacksize;

}Sqstack;

int InitStack (Sqstack &s) //建立一个空栈

{

s.base=(bstree*)malloc(1000 * sizeof(int));

s.top=s.base;

return 1;

};

int Push(Sqstack &s ,node *e)//在栈顶插入元素〔进栈〕{

*s.top=e;

s.top=s.top+1;

return 1;

};

int Pop(Sqstack &s, bstree &e)//出栈

{

if(s.top==s.base)return 0;

else s.top=s.top-1;

e=*s.top;

return 1;

};

//非递归历遍并输出结点信息//

/*---------------先序非递归遍历---------------*/ void x_print(node *t)

{

Sqstack s;

InitStack(s);

bstnode *p;

p=t;

while(p||!(s.top==s.base))

{

if(p)

{

Push(s,p);

cout<key<<"\t"<

cout<name<<"\t"<

cout<grade<<"\t"<

p=p->lchild;

}

else

{

Pop(s,p);

p=p->rchild;

}

}

}

/*---------------中序非递归遍历---------------*/ void z_print(node *t)

{

Sqstack s;

InitStack(s);

bstnode *p;

while(p||!(s.top==s.base))

{

if(p)

{

Push(s,p);

p=p->lchild;

}

else

{

Pop(s,p);

cout<key<<"\t"<

cout<name<<"\t"<

cout<grade<<"\t"<

p=p->rchild;

}

}

}

/*---------------非递归后序遍历---------------*/

void h_print(node *t)

{

Sqstack s;

InitStack(s);

node *p,*q;

p=t;

q=NULL;

while(p || !(s.top==s.base))

{

if(p){

Push(s,p);

p=p->lchild;

}else

{

p=*(s.top-1);

if(p->rchild==q)

{

Pop(s,q);p=NULL;

cout<key<<"\t"<

cout<name<<"\t"<

cout<grade<<"\t"<

}else

p=p->rchild;q=NULL;

}

}

}

}

//递归查找二叉树//

/*---归查找,假设找到就返回指向该结点的指针,否那么返回空---*/ bstnode *SearchBST(bstree t,keytype key) {

if(t==NULL||key==t->key)

return t;

if(keykey)

return SearchBST(t->lchild ,key);

else

return SearchBST(t->rchild ,key);

}

//-------------------给定学生信息插入到二叉树中-------------------// bstree InsertBST(bstree t,int key,nametype name,double grade)

{

bstree p,q;

if(t==NULL) //树初始为空,新建二叉树

{

t=new bstnode();

t->key=key;

t->name=name;

t->grade=grade;

t->lchild=t->rchild=NULL;

}

else

{

p=t;

while(p) //树已存在,按照二叉排序树的特性查找

{

q=p;

if(p->key>key)

p=q->lchild;

else if(p->key

p=q->rchild;

else

{

cout<

cout<<"树中已有该节点:"<

cout<

return t;

}

p=new bstnode(); //找不到结点就新建一个结点插入到二叉排序树中p->key=key;

p->name=name;

p->grade=grade;

p->lchild=p->rchild=NULL;

if(q->key>key)

q->lchild=p;

else

q->rchild=p;

}

return t;

}

//-------------------二叉树排序树的构建-------------------//

bstree CreatTree() //不断输入学生信息以插入到二叉树中

{

bstree t=NULL;

keytype key;

nametype name;

double grade;

cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<

cin>>key;

if(key==0)

return t;

cin>>name;

cin>>grade;

while(key) //key==0时退出

{

t=InsertBST(t,key,name,grade);

cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<

cin>>key;

if(key==0)

break;

cin>>name;

cin>>grade;

}

return t;

}

//-------------------删除树中的结点-------------------//

void Delete(bstree &p) //删除结点的函数

{

bstree q,s;

if(!p->rchild)

{

q=p;

p=q->lchild ;

delete q;

}

else if(!p->lchild)

{

q=p;

p=p->rchild;

delete q;

}

else

{

q=p;

s=p->lchild;

while(s->rchild)

{

q=s;

s=s->rchild;

}

p->name=s->name;

if(q!=p)

q->rchild=s->lchild;

else

q->lchild=s->lchild;

delete s;

}

}

void DeleteData(bstree &t,keytype key)

{

if(!t){

cout<<"没有该信息,请重新输入!";

cin>>key;

DeleteData(t,key);

}

else

{

if(t->key==key)

{

Delete(t); //假设找到结点直接删除

cout<<"删除成功!"<

}

else if(t->key>key)

DeleteData(t->lchild,key); //结点数据比查找关键字大,继续在其左子树中查找else

DeleteData(t->rchild,key); //结点数据比查找关键字小,继续在其右子树中查找}

}

//数组和二叉排序树的查找效率比拟//

void pare()

{

bstree t=NULL;

clock_t start,end,start1,end1;

int num=0;

int a=0;

int b=0;

int c=0;

int d=1;

bstree p;

string key,name;

double grade;

nametype str [100][3];

//cout<<"〔输入0时完毕〕"<

cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<

cin>>key;

if(key=="0")

return ;

cin>>name;

cin>>grade;

while(key!="0")

{

str[num][0]=key;

str[num][1]=name;

str[num][2]=grade;

int key1=atoi(key.c_str()); //用库函数将字符串转化为关键字的int型

t=InsertBST(t,key1,name,grade); //插入结点

cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<

cin>>key;

if(key=="0")

break;

cin>>name;

cin>>grade;

num++;

}

cout<

cout<<"进展数组和二叉排序树的查询效率比拟〔比拟:1 不比拟:0〕";

cin>>d;

while(d!=NULL)

{

switch(d)

{

case 0:

cout<<"返回选择界面"<

break;

case 1:

cout<<"数组查询!"<

cout<<"请输入查询的成绩:"<

cin>>key;

start=clock();

while(a<=10000000) //循环模拟数组查找

{

while(b<=99)

{

if(str[b][0]==key)

{b=100;}

else

b++;

}

b=0;

a++;

}

end=clock();

if(num>=100)

cout<<"数组查询:无查询信息,花费时间: "<

else

cout<<"数组查询:查到信息,花费时间: "<

int key1=atoi(key.c_str()); //同上转化

start1=clock();

while(c<=10000000) //用循环来模拟树中查找

{

p=SearchBST(t,key1);

c++;

}

end1=clock();

if(p==NULL)

cout<<"树查询:无查询信息,花费时间: "<

else

cout<<"树查询:查到信息,花费时间: "<

a=0;

b=0;

c=0;

break;

}

cout<<"是否继续进展操作〔是:1 否:0〕:";

cin>>d;

}

}

//二叉树的深度

int TreeDepth(bstree t)

{

int left,right,max;

if(t!=NULL)

{

left=TreeDepth(t->lchild);

right=TreeDepth(t->rchild);

max=left>right?left:right;

return max+1;

}else

{

return 0;

}

}

//树状输出二叉树

void PrintTree(bstree t,int layer)

{

int k;

if(t==NULL)

return ;

PrintTree(t->rchild,layer+1);

for(k=0;k

cout<<" ";

cout<key<<"\n";

PrintTree(t->lchild,layer+1);

}

//-------------------主函数测试-------------------//

int main()

{

int d;

keytype key;

bstree t=NULL;

t=CreatTree();

d=TreeDepth(t);

cout<<"二叉排序树的树形表示如下"<

PrintTree(t,d);

char choose;

nametype name;

bstree p;

double grade;

cout<<" "<

cout<<"-----------------------------请输入你要选择的操作-------------------------------"<

cout<<" ||-----------------------------------||"<

cout<<" || a 插入信息||"<

cout<<" |-------------------------------------|"<

cout<

cout<<"需要选择的操作为:";

cin>>choose;

cout<

while(choose)

{

switch(choose)

{

case 'a':

//cout<<"输入学生信息信息〔学号为0时完毕〕."<

cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<

cin>>key;

if(key==0) /*{

PrintTree(t,d);

break;}*/

cin>>name;

cin>>grade;

while(key)

{

t=InsertBST(t,key,name,grade);

cout<<"请输入---学号---XX---成绩---:"<

cin>>key;

if(key==0)

break;

cin>>name;

cin>>grade;

}

break;

case 'b':

cout<<"请输入要删除信息学生的成绩:"<

cin>>key;

DeleteData(t,key);

d=TreeDepth(t);

cout<<"删除结点后二叉树的树形显示如下"<

PrintTree(t,d);

break;

case 'c':

cout<<"请输入要查询的成绩:"<

cin>>key;

p=SearchBST(t,key);

if(p==NULL)

cout<<"无查询的关键字:"<

else

cout<<"成绩"<<"\t"<

cout<key<<"\t"<

cout<name<<"\t"<

cout<grade<

break;

case 'd':

cout<<"请输入要修改的学号:"<

cin>>key;

p=SearchBST(t,key);

if(p==NULL)

cout<<"无你所要修改的关键字:"<

else

{

cout<<"请输入修改的XX:";

cin>>name;

cout<<"请输入修改的成绩:";

cin>>grade;

p->name=name;

p->grade=grade;

}

break;

case 'e':

if(!t)

cout<<"没有任何信息,请先输入信息!";

else

{

cout<<"学号"<<"\t"<

cout<<"------------------非递归先序遍历----------------"<

cout<

x_print(t);

cout<<"------------------非递归中序遍历-----------------"<

cout<

z_print(t);

cout<<"------------------非递归后序遍历-----------------"<

cout<

h_print(t);

}

break;

case 'f':

cout<<"***此实验为独立实验,实验数据独立于外部数据***"<

cout<<"***请重新输入相关信息***"<

pare();

break;

default:

cout<<"选择错误!";

break;

}

cout<

cout<

cout<<" "<

cout<<"-----------------------------请输入你要选择的操作-------------------------------"<

cout<<" ||-----------------------------------||"<

cout<<" || a 插入信息||"<

cout<<" |-------------------------------------|"<

cout<

cout<<"选择的操作位:";

cin>>choose;

cout<

}

return 0;

}

4.运行结果及截图

从键盘读入数据

以0作为完毕标志可得二叉排序树树状表示

主菜单项选择择模块

需要在树种添加节点那么执行操作a 需要在书中删除节点执行操作b

需要查询节点信息执行操作c

数据结构-二叉排序树

二叉排序树操作 一、设计步骤 1)分析课程设计题目的要求 2)写出详细设计说明 3)编写程序代码,调试程序使其能正确运行 4)设计完成的软件要便于操作和使用 5)设计完成后提交课程设计报告 (一)程序功能: 1)创建二叉排序树 2)输出二叉排序树 3)在二叉排序树中插入新结点 4)在二叉排序树中删除给定的值 5)在二叉排序树中查找所给定的值 (二)函数功能: 1) struct BiTnode 定义二叉链表结点类型包含结点的信息 2) class BT 二叉排序树类,以实现二叉排序树的相关操作 3) InitBitree() 构造函数,使根节点指向空 4) ~BT () 析构函数,释放结点空间 5) void InsertBST(&t,key) 实现二叉排序树的插入功能 6) int SearchBST(t,key) 实现二叉排序树的查找功能 7) int DelBST(&t,key) 实现二叉排序树的删除功能 8) void InorderBiTree (t) 实现二叉排序树的排序(输出功能) 9) int main() 主函数,用来完成对二叉排序树类中各个函数的测试

二、设计理论分析方法 (一)二叉排序树定义 首先,我们应该明确所谓二叉排序树是指满足下列条件的二叉树: (1)左子树上的所有结点值均小于根结点值; (2)右子数上的所有结点值均不小于根结点值; (3)左、右子数也满足上述两个条件。 根据对上述的理解和分析,我们就可以先创建出一个二叉链表结点的结构体类型(struct BiTNode)和一个二叉排序树类(class BT),以及类中的构造函数、析构函数和其他实现相关功能的函数。 (二)插入函数(void InsertBST(&t,key)) 首先定义一个与BiTNode *BT同一类型的结点p,并为其申请空间,使p->data=key,p->lchild和p->rchild=NULL。然后通过对int SearchBST(t,key)的返回值,来判断插入的结点是否已存在,若不存在则从根节点开始,按照二叉排序树的定义来寻找存放新结点的位置,已实现插入操作。 (三)查找函数(int SearchBST(t,key)) 同样,根据二叉排序树的定义,若所查找的数小于当前结点,则使当前结点等于该结点所指向的左孩子。反之,指向其右孩子。 直到找到与所查找的数值相等时,输出该值;或当查找到的结点已经指向空时,则说明该二叉排序树中没有所查找的值。 (四)删除函数(int DelBST(&t,key)) 首先要找到被删除元素所在的结点p与他的父结点f。然后分一下3种情况进行处理: (1)p为叶子结点,此时直接删除该结点,再修改其父结点的指针。 (2)p只存在一个孩子,若p是f的左孩子,则将p的单支子树链接到f的左指针上;否则将p的单支子树链接到f的右指针上。 (3)p的左子树与右子树均不空。此时,若p的左孩子的右子树为空,则将p的左孩子赋值给p,左孩子的左子树链接到结点p的左指针上;否则,从结点p的

二叉排序树实验报告

数据结构 实验报告 实验题目:二叉排序树 班级: 姓名: 学号: 完成日期:

一、需求分析(说明实验的任务,包括输入、输出、功能、测试数据等) 输入数据的第一行为一个正整数T, 表示测试数据的组数。然后是T组测试数据。每组测试数据的第一行输入正整数n(5≤n≤20),第二行输入n个整数,要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key,对该二叉排序树进行查找,若在该二叉排序树中存在这个整数key,则输出find,否则输出not find。 (4) 输入一个整数key,若该二叉排序树中不存在这个整数key,则将key插入到该二叉排序树中,使插入后仍为原性质的二叉排序树;否则不必插入; (5) 在(4)的基础上,按递减顺序输出该二叉排序树中的整数(关键字) 二、概要设计 1、算法思路 (1) 首先要建立二叉排序树。我们要建立的二叉排序树,其关键字要求是各不相同的,则对于输入的关键字(整数)序列中的每一个整数,要在正在建立的二叉排序树中去查找是否已经存在该整数,不存在时,由查找模块(其算法思路后述)返回要增加(插入)结点位置的双亲结点,根据要建立的二叉排序树的性质(左小右大),当要增加的整数比双亲结点的整数小的话就插(挂)到其左孩子的位置,否则插(挂)到其右孩子的位置。这样重复,直到输入结束(输入的整数为-1),这样,二叉排序树就建好了。 (2) 查找算法是从二叉排序树的根结点开始,根据要查找的整数,若比其当前二叉排序树结点中的整数小就进入其左孩子所在的左子树中继续搜索,否则进入其右左孩子所在的右子树中继续搜索,这过程中,每进入子树前,保存当前结点(指针),以便带回要增加(插入)结点的双亲结点。搜索直至找到要查找的整数,用一指针带回;或搜索直至叶子结点的下方,找不到要查找的整数而使空指针带回,以便判断要查找的整数是否找到。 (3) 按递增顺序输出该二叉排序树中的整数(关键字),可直接用某种二叉树的遍历算法实现;按递减顺序输出该二叉排序树中的整数(关键字),只要对某种二叉树的遍历算法稍作修改即可。 (4) 插入算法思路和建立二叉排序树时增加一个整数的思路是一样的。 2、数据结构 typedef struct node // 二叉排序树中的结点结构 {int data; // 整数(关键字)数据域 struct node *lchild,*rchild; // 指向左右孩子的指针 }nodeb,*bitree; 3、基本操作 (1) 查找算法

数据结构二叉排序树课程设计报告

课程设计报 告 —-数据结构 题目:二叉排序树 姓名: 学号: 专业: 班级: 指导老师:

年月日

目录 一、课程设计简介...................... 错误!未定义书签。 二、原理分析及流程 (3) 2.1、原理分 析。.。.。.....。.。。.....。.。..。。..。.。.。。。. .。.........。。.。.。....。..。..。.。.。..。..。。.3 2.2、流程图......。...........。。。....。..。。。....。。。。...。。..。.。.。。。.。..。..。...。。.。。....。....。。4 1、main()函数...。。。..。...。.。。......。..。..。。。。.。。。.。..。. ..。.。.......。..........。。。4 2、创建.。。.。...。。。.....。。。..。...。。。..。。。.....。。..。..。....。。....。.。。。....。.。。..。......。4 3、插入。.。...。..。...。。。..。.。...。......。.。。。。....。。...。.........。.。.。.....。....。.。。.。。.5 4、查找。...。..。.。....。。。..。.。。.。..。....。..。.。..。....。..。.。.。......。...。。。.。。...。...。..6 5、中序遍历输出?7

三、算法描述........................................ 8 3.1、存储结构?8 3.2、插入算法?8 3。3、查找算法 (9) 3.4、删除算法 (10) 四、小结与体会?12 五、程序执行过程 (13) 5.1、创建二叉排序树并中序输 出.。。.。..。。...。.....。..。。......。.。.....。.。。1 5。2、插入并中序输3? 出...。.。。。.。.......。......。..。。。....。...。.. ...。。。。。...。..。..。..。13 5.3、查 找....。。.。。.。.....。..。.。。..。。...。...。....。。. 。...。....。。。.。..。.。.。。。.。。。。。..。。。.。。...14 六、程序清单....................................... 14一、课程设计简介 1.1、题目:二叉排序树相关操作 1、创建二叉排序树;2、插入给定值; 3、查找给定值; 4、删除给定值的结点。

数据结构课程设计(二叉树的基本操作)

重庆大学城市科技学院 课程设计报告 二叉树的基本操作 学院:电气信息学院 专业:软件工程 年级: 2011 姓名: 班级: 01 学号: 20110286 成绩: 完成时间: 2013年1月2日 指导教师:

目录 一、需求分析 (3) 二、概要设计 (3) 三、详细设计 (4) 四、调试结果 (11) 五、课程设计总结 (11)

一、需求分析 二叉树形象地说即树中每个节点最多只有两个分支,它是一种重要的数据类型。可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表等。 二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。演示程序以用户与计算机对话的方式进行,即在计算机终端上显示提示信息后,由用户在键盘上输入相应动作的序号和相应的输入数据。 1.1课程设计任务及要求 (1)按先序次序输入二叉树中结点的值,构造二叉链表表示的二叉树t; (2)对二叉树t作先序、中序、后序遍历的递归算法,输出结果; (3)计算二叉树t的深度,输出结果; (4)计算二叉树t的叶子结点个数 1.2课程设计思想 本次课程设计中,用到的主要知识就是递归思想,着重体会递归的思想。建立二叉树采用先序次序插入的方式。对二叉树进行遍历时采用递归函数的方式。求二叉树的深度及叶子结点个数均采用递归方式。 二、概要设计 2.1对程序中定义的核心数据结构及对其说明: typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为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,失败。

数据结构实验报告-树(二叉树)

实验5:树(二叉树)(采用二叉链表存储) 一、实验项目名称 二叉树及其应用 二、实验目的 熟悉二叉树的存储结构的特性以及二叉树的基本操作。 三、实验基本原理 之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。 四、主要仪器设备及耗材 Window 11、Dev-C++5.11 五、实验步骤 1.导入库和预定义 2.创建二叉树 3.前序遍历

4.中序遍历 5.后序遍历 6.总结点数 7.叶子节点数 8.树的深度 9.树根到叶子的最长路径

10.交换所有节点的左右子女 11.顺序存储 12.显示顺序存储 13.测试函数和主函数 对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码: #include using namespace std; #define MAX_TREE_SIZE 100 typedef char ElemType; ElemType SqBiTree[MAX_TREE_SIZE]; struct BiTNode { ElemType data; BiTNode *l,*r; }*T; void createBiTree(BiTNode *&T) { ElemType e; e = getchar(); if(e == '\n') return; else if(e == ' ') T = NULL; else { if(!(T = (BiTNode *)malloc(sizeof (BiTNode)))) { cout << "内存分配错误!" << endl; exit(0); }

数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告 学生姓名 学生班级 学生学号 指导老师

一、实验内容 1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序 以及按层次遍历的操作,求所有叶子及结点总数的操作。 2) 输出树的深度,最大元,最小元。 二、需求分析 遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。 下面重点来讲述非递归方法: 首先介绍先序遍历: 先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。 再次介绍中序遍历: 中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。 最后介绍后序遍历: 后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。 三、详细设计 源代码:

数据结构c语言课设-二叉树排序

题目:二叉排序树的实现 1 内容和要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进展先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么? 2 解决方案和关键代码 2.1 解决方案: 先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。 前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。 要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。 2.2关键代码 树的根本构造定义及根本函数 typedef struct { KeyType key; } ElemType; typedef struct BiTNode//定义链表 { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree, *SElemType; //销毁树 int DestroyBiTree(BiTree &T) { if (T != NULL) free(T);

return 0; } //清空树 int ClearBiTree(BiTree &T) { if (T != NULL) { T->lchild = NULL; T->rchild = NULL; T = NULL; } return 0; } //查找关键字,指针p返回 int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) { if (!T) { p = f; return FALSE; } else if EQ(key, T->data.key) { p = T; return TRUE; } else if LT(key, T->data.key) return SearchBST(T->lchild, key, T, p); else return SearchBST(T->rchild, key, T, p); } 二叉树的生成、插入,删除 生成 void CreateBST(BiTree &BT, BiTree p) { int i; ElemType k; printf("请输入元素值以创立排序二叉树:\n"); scanf_s("%d", &k.key); for (i = 0; k.key != NULL; i++) { //判断是否重复

数据结构试验报告用先序中序建立二叉树后序遍历非递归

《数据结构》实验报告 ◎实验题目:创办并遍历二叉树 ◎实验目的:熟悉二叉树积蓄结构,熟悉二叉树的三种遍历方法,并能用非递归的方法建 立并且遍历二叉树。 ◎实验内容:用先序和中序建立二叉树,用后序遍历并输出二叉树,要求算法非递归。 一、需求剖析 该程序用非递归的方法,利用先序和中序建立二叉树,今后用后序遍历的方法输出二叉树的元素。 1、输入的形式和输入值的范围; 程序运行时输入二叉树的先序和中序序列,为字符型元素。 2、输出的形式; 运行结果为输出二叉树的后序序列,亦为字符型元素。 3、程序所能达到的功能; 本程序可以建立一个二叉树积蓄结构,并且接见其结点元素。 4、测试数据: 输入:先序:abcde 中序:edcba 输出:后序:edcba 二大纲设计 1.本程序中第一需定义二叉树的节点种类,节点为一个含有数据与和指针域的结构体。 2.其次,本程序中需要用两个栈,一个用来存放指针,一个用来存放数组元素的下标。 3.主程序中,分别输入两个字符串,作为二叉树的先序和中序序列;两个子函数分别实现创办二叉树和后序遍历输出二叉树的功能。而在子函数中还调用了比方出栈入栈等子函数。 三详细设计 1.?定义二叉树节点种类 structnode { chardata; structnode*lchild; structnode*rchild; }BTree;? 2.定义两个栈的种类 structsnode { inttop; inta[MAX]; }; structsnode1

{ inttop; structnode*c[MAX]; }; 3.主函数 voidmain() { chara[MAX]={0}; charb[MAX]={0}; charc=0,d=0; inti=0,j=0; structnode*g; snodes; snode1s4,s1; Initstack(&s); Initstack1(&s4); Initstack1(&s1); printf("请输入先序序列:\n"); while(c!='\n') { c=getchar(); a[i]=c; i++; } printf("请输入中序序列:\n"); while(d!='\n') { d=getchar(); b[j]=d; j++; } g=create(&s,&s1,a,b); printf("遍历输出后序序列:\n"); visit(&s4,g); printf("\n"); } 4.子函数一,创办二叉树 structnode*create(snode*s,snode1*s1,chara[MAX],charb[MAX]) { inti=1,num,x; structnode*p,*q,*r,*root; p=(structnode*)malloc(sizeof(BTree));

数据结构课程设计报告——二叉排序树(用顺序表结构存储)

摘要: 数据结构是研究与数据之间的关系,我们称这一关系为数据的逻辑结构,简称数据结构。当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。相同的逻辑结构可以具有不同的存储结构,因而有不同的算法。本次课程设计,程序中的数据采用“树形结构”作为其数据结构。而二叉搜索树又是一种特殊的二叉树。本课程设中的二叉排序树是基于二叉链表作存储结构的,一共要实现五项基本的功能。它们分别是二叉搜索树的创建、中序遍历、查找结点、删除结点和计算二叉排序树搜索成功时的平均查找长度。 关键词:二叉排序树;中序遍历;搜索结点;删除结点;平均查找长度

目录 1需求分析 (1) 1.1课程设计题目、任务及要求 (1) 1.2课程设计思想 (1) 2概要设计 (2) 2.1 二叉排序树的定义 (2) 2.2二叉链表的存储结构 (2) 2.3建立二叉排序树 (2) 2.4二叉排序树的生成过程 (3) 2.5中序遍历二叉树 (3) 2.6二叉排序树的查找 (3) 2.7二叉排序树的插入 (4) 2.8平均查找长度 (4) 3详细设计和实现 (4) 3.1主要功能模块设计 (4) 3.2主程序设计 (5) 4调试与操作说明 (12) 4.1程序调试 (12) 4.2程序操作说明 (13) 总结 (16) 致谢 (17) 参考文献 (18)

1需求分析 1.1课程设计题目、任务及要求 二叉排序树。用二叉链表作存储结构 (1)以(0)为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T:若存在含x的结点,则删除该结点,并作中序 遍历(执行操作2);否则输出信息“无x”; 1.2课程设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。然后利用插入函数将该元素插入原树。 对二叉排序树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。由于二叉排序树自身的性质,左子树小于根结点,而根结点小于右子树,所以中序遍历的结果是递增的。 计算二插排序树的平均查找长度时,仍采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。 删除结点函数,采用边查找边删除的方式。如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论: 1、该结点左右子树均为空; 2、该结点仅左子树为空; 3、该结点仅右子树为空; 4、该结点左右子树均不为空。

数据结构课程设计报告-二叉树

湖南涉外经济学院 课程设计报告 课程名称:数据结构 报告题目:二叉树的基本操作 学生姓名:肖琳桂、康政、张小东、张帆所在学院:信息科学与工程学院 专业班级:软工本1402

学生学号:1、02、14、08 扌旨导教师:_________ 李春庭

2015年12月31日课程设计任务书

第17周: 周1---周2 :立题、论证方案设计 周3---周5 :程序设计及程序编码 第18周: 周1---周3 :程序调试 周4---周5 :验收答辩 摘要 本课程设计主要说明如何在C++编程环境下实现二叉树的遍历,遍历方式包括:二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。同时,此次课程设计还包括了求二叉树深度和结点个数,结点的孩子信息,以及对文件的操作,用文件读取的方式实现对二叉树的建立。以通过此次课程设计,使学生充分掌握树的基本操作,以及对线性存储结构的理解。同时,在对树的遍历的操作过程中,同样是运用递归的方式实现遍历,在对树实现层次操作的时候,要求用循环队列的操作方式来实现层次遍历。此次课程设计对数据结构内容综合性的运用的要求较高。 关键词:二叉树,先序遍历,中序遍历,后序遍历,层次遍历,节点,线性存储, 节点的孩子信息

目录 课程设计任务书 (2) 一、需求分析 (5) 1.问题描述 (5) 2.功能要求 (5) 二、概要设计 (6) 1. 总体设计图 (6) 2. 数据结构设计 (6) 3. 算法设计 (6) 4. 主要模块及模块之间的关系 (7) 三、详细设计 (7) 1. 结构体(或类)设计 (7) 2. 主要模块实现的流程图 (7) 3. 算法设计 (9) 四、测试运行 (10) 1.登录和主界面运行效果图 (10) 2.运行说明 (10) 3. 运行效果图 (10) 五、结论与心得 (11) 1. 总体评价 (11) 2. 所做的工作及体会 (11) 六、程序附录(源代码) (15) 七、参考文献 (17)

数据结构二叉树实验报告

一 、实验目的和要求 (1)掌握树的相关概念,包括树、节点的度、树的度、分支节点、叶子节点、孩子节点、双亲节 点、树的深度、森林等定义。 (2)掌握树的表示,包括树形表示法、文氏图表示法、凹入表示法和括号表示法等。 (3)掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。 (4)掌握二叉树的性质。 (5)重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。 (6)重点掌握二叉树的基本运算和各种遍历算法的实现。 (7)掌握线索二叉树的概念和相关算法的实现。 (8)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码的产生方法。 (9)掌握并查集的相关概念和算法。 (10)灵活运用二叉树这种数据结构解决一些综合应用问题。 二、实验内容 注:二叉树b 为如图7-123所示的一棵二叉树 图7-123+ 实验7.1 编写一个程序algo7-1.cpp,实现二叉树的各种运算,并在此基础上设计一个程序 exp7-1.cpp 完成如下功能: (1)输出二叉树b ; (2)输出H 节点的左、右孩子节点值; (3)输出二叉树b 的深度; (4)输出二叉树b 的宽度; (5)输出二叉树b 的节点个数; (6)输出二叉树b 的叶子节点个数。 实验7.2设计一个程序exp7-2.cpp,实现二叉树的先序遍历、中序遍历和后序遍历和非递归算法, 以及层次变量里的算法。并对图7-123所示的二叉树b 给出求解结果。 b+ A C F G I K L+ N M+ E+ Hd J D ₄ B

臣1607-1.CPP if(b?-HULL) re3P4+; Qu[rear]-p-b; Qu[rear].1no=1; while(reart=front) { Front++; b=Qu[front]-P; lnum-Qu[front].1no; if(b->Ichildt=NULL) rpar+t; Qu[rear]-p=b->1child; Qu[rear].Ino-lnun+1; if(D->rch11d?=NULL)1/根结点指针入队 //根结点的层次编号为1 1/队列不为空 1/队头出队 1/左孩子入队 1/右孩子入队 redr+t; qu[rear]-p=b->rchild; Qu[rear].1no-lnun*1; } } nax-0;lnun-1;i-1; uhile(i<=rear) { n=0; whdle(i<=rear ge Qu[1].1no==1num) n+t;it+; Inun-Qu[i].1n0; if(n>max)nax=n; } return max; 田1607-1.CPP return max; } else return o; 口× int Modes(BTNode *D) //求二叉树D的结点个数 int nun1,nun2; if(b==NULL) returng, else if(b->ichild==NULL&D->rchild==NULL) return 1; else { num1-Hodes(b->Ichild); num2=Nodes(b->rchild); return(num1+nun2+1); LeafNodes(BINode *D) //求二叉树p的叶子结点个数 int num1,num2; 1f(D==NULL) return 0; else if(b->1chi1d==NULLc& b->rch11d==NULL) return 1; else { num1-LeafModes(b->lchild); num2=LeafNodes(b->rchild); return(nun1+nun2); int

二叉排序树的实验报告

二叉排序树的实验报告 二叉排序树的实验报告 引言: 二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数 据按照一定的规则组织起来,便于快速的查找、插入和删除操作。本次实验旨 在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。 一、实验背景 二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值, 小于其右子树的所有节点的值。这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。 二、实验目的 1. 理解二叉排序树的基本原理和性质; 2. 掌握二叉排序树的构建、插入和删除操作; 3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。 三、实验过程 1. 构建二叉排序树 首先,我们需要构建一个空的二叉排序树。在构建过程中,我们可以选择一个 节点作为根节点,并将其他节点插入到树中。插入节点时,根据节点的值与当 前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子 树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。重复这个 过程,直到所有节点都被插入到树中。 2. 插入节点

在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。首先,从 根节点开始,将新节点的值与当前节点的值进行比较。如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当 前节点的右子树中。如果新节点的值与当前节点的值相等,则不进行插入操作。 3. 删除节点 在二叉排序树中删除节点时,我们需要考虑不同的情况。如果要删除的节点是 叶子节点,即没有左右子树,我们可以直接删除该节点。如果要删除的节点只 有一个子树,我们可以将子树连接到要删除节点的父节点上。如果要删除的节 点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点 替代该节点,并删除相应的替代节点。 四、实验结果 通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果: 1. 二叉排序树可以高效地进行查找操作。由于每次比较都可以排除一半的节点,所以查找的时间复杂度为O(log n),其中n为节点的个数。 2. 插入节点的操作相对简单,时间复杂度也为O(log n)。但是在最坏情况下, 二叉排序树可能退化为链表,导致插入操作的时间复杂度为O(n)。 3. 删除节点的操作相对复杂,需要考虑不同的情况。在最坏情况下,删除操作 的时间复杂度也为O(n)。 五、实验总结 通过本次实验,我们深入了解了二叉排序树的原理和实现,并验证了其性能和 效果。二叉排序树作为一种常用的数据结构,在实际应用中具有重要的作用。 然而,我们也需要注意二叉排序树的局限性,特别是在插入和删除操作中可能

《数据结构》课程二叉排序树的操作实验指导

《数据结构》课程二叉排序树的操作实验指导 一、实验名称和性质 二、实验目的 1.掌握二叉排序树的含义及其在计算机中的存储实现。 2.掌握在二叉排序树上查找操作的算法实现。 3.掌握二叉排序树的插入、删除操作的算法实现。 三、实验内容 1.建立二叉排序树。 2.在二叉排序树上实现对给定值进行查找操作(验证性内容)。 3.在二叉排序树上实现插入、删除一个指定结点(设计性内容)。 4.判断一棵二叉树是否为二叉排序树(设计性内容)。 四、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: Windows环境下的TurboC2.0以上或VC++等。 五、知识准备 前期要求掌握二叉排序树的含义、二叉排序树上的查找算法和二叉排序上的插入、删除操作的算法。 六、验证性实验 1.实验要求 编程实现如下功能: (1)按照输入的n个关键字序列顺序建立二叉排序树,二叉排序树采用二叉链表的存储结构。 (2)先输入待查找记录的关键字值key,然后在二叉排序树上查找该记录,如果在二叉排序树中存在该记录,则显示“找到”的信息,否则显示“找不到”的信息。 2. 实验相关原理: 二叉排序树的性质如下: (1)若左子树不空,则左子树上所有结点的值均小于根结点的值。 (2)若右子结不空,则右子树上所有结点的值均大于根结点的值。 (3)左右子树又分别是二叉排序树。 二叉排序树的二叉链表存储结构描述为:

typedef struct Bitnode /*定义二叉排序树的结点类型*/ { keytype key;/*存放记录关键值的数据域key*/ elemtype other; /*存储记录中的其它数据项的域*/ struct Bitnode *lchild, *rchild; /*左、右孩子指针域*/ }Bitnode,*Bitree; 【核心算法提示】 (1)二叉排序树查找操作的基本步骤:对于给定的待查找记录的关键字值key,在二叉排序树非空的情况下,先将给定的值key与二叉排序树的根结点的关键字值进行比较,如果相等,则查找成功,函数返回指向根结点的指针,否则,如果给定的值key小于根结点的关键字值,则在二叉排序树的左子树上继续查找;如果给定的值key大于根结点的关键字值,则在二叉排序树的右子树上继续查找,直到查找成功,或子树为空即查找失败函数返回空指针为止。 (2)二叉排序树的插入操作的基本步骤(用递归的方法):如果已知二叉排序树是空树,则插入的结点成为二叉排序树的根结点;如果待插入结点的关键字值小于根结点的关键字值,则插入到左子树中;如果待插入结点的关键字值大于根结点的关键字值,则插入到右子树中。【核心算法描述】 Bitree Bstsearch1(Bitree T,keytype key) /*二叉排序树查找的递归算法*/ { if (T==NULL||key==T->key) return T; /*当T为非空时,查找成功,否则表示查找失败*/ else if (key< T->key) return(searchbst(T->key, key)); /*递归查找二叉排序树的左子树*/ else return(searchbst(T->key, key)); /*递归查找二叉排序树的右子树*/ } Bitree Bstsearch2(Bitree T,keytype key) /*二叉排序树查找的非递归算法*/ { Bitree p; p=T; while (p&& key!= p->key) { if (keykey) p=p->lchild; /*沿左子树继续查找*/ else p=p->rchild; /*沿右子树继续查找*/ } return p; } Bitree Bstinsert(Bitree T,Bitree s) /*将结点s插入到二叉排序树T中,使其仍然构成一棵二叉排序树*/ { if(T==NULL) T=s; /*如果已知二叉排序树是空树,则新插入的结点成为根结点*/ else if(s->key>T->key) T->rchild=Bstinsert(T->rchild,s); /*递归调用*/ else if(s->keykey) T->lchild=Bstinsert(T->lchild,s);/*递归调用*/

数据结构实验-二叉排序树应用实验报告

实验报告 实验课程:数据结构 实验项目:实验四二叉排序树应用 专业:计算机科学与技术 班级: 姓名: 学号: 指导教师:

目录一、问题定义及需求分析 (1)问题描述 (2)实验任务 (3)需求分析 二、概要设计: (1)抽象数据类型定义 (2)主程序流程 (3) 模块关系 三、详细设计 (1)数据类型及存储结构 (2)模块设计 四、调试分析 (1)调试分析 (2)算法时空分析 (3)经验体会 五、使用说明 (1)程序使用说明 六、测试结果 (1)运行测试结果截图 七、附录 (1)源代码

一、问题定义及需求分析 (1)实验目的 二叉排序树应用 问题描述 互联网域名系统是一个典型的树形层次结构。从根节点往下的第一层是顶层域,如cn、com等,最底层(第四层)是叶子结点,如www等。因此,域名搜索可以构造树的结构完成; (2)实验任务 设计基于二叉排序树的搜索互联网域名的程序。 (3)需求分析: 1)采用二叉树的二叉链表存储结构。 2)完成二叉排序树的创建、插入、删除、查询操作。 3)可以考虑两棵二叉排序树的合并。 二、概要设计: (1)抽象数据类型定义: 程序中定义了二叉排序树的节点类型;由数据域和左右孩子指针构成;指针类型为该节点类型,指向该类型的节点形成二叉排序树;数据域是由字符数组构成,用于存储节点数据信息。 (2)主程序流程: 输入域名拆分域名并完成二叉排序树的创建调用功能函数进入功能菜单选择执行不同的操作(查找、插入、删除) 操作完毕后可选择返回功能函数继续执行操作或者结束程序 (3)模块间的调用关系: 创建二叉排序树 功能函数 查找插入 选择 结束

二叉排序树与平衡二叉树的实现课程设计

攀枝花学院本科学生课程设计任务书 注:任务书由指导教师填写。

摘要及关键字 本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。 二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。 二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 关键字:数列L,结点,二叉排序树,平衡二叉树

目录 摘要 (3) 1 绪论 (5) 1.1 课程设计的目的 (5) 1.2 相关知识的阐述 (5) 1.2.1一位数组的存储结构 (5) 1.2.2建立二叉排序树 (5) 1.2.3中序遍历二叉树 (5) 1.2.4平均查找长度 (6) 1.2.5平均二叉树(AVL树) (6) 1.2.6平衡因子 (7) 1.2.7平衡二叉树的调整方法 (7) 2方案设计 (8) 2.1 模块功能 (8) 3 算法设计 (8) 3.1 算法流程图 (8) 4详细设计 (10) 4.1 主程序 (10) 4.2 定义二叉树结构 (11) 4.3 建立二叉树 (11) 4.3.1二叉排序树的查找 (11) 4.3.2二叉排序树的插入 (11) 4.4 中序遍历 (12) 4.5 平均查找长度 (12) 4.6 删除节点 (12) 4.7 判断平衡二叉树 (13) 5 调试分析 (14) 5.1 时间复杂度的分析 (14) 5.2 运行结果 (14) 5.3 结果分析 (15) 6 课程设计总结 (16) 参考文献 (17)

(完整word版)二叉排序树的实现

课程设计说明书 课程名称: 数据结构 设计题目: 二叉排序树的实现 院系: 学生姓名: 学号: 专业班级: 指导教师: 2010年5月29日

课程设计任务书 学生应完成的工作: 1、按设计要求完成各项任务。 2、测试数据及测试结果在上交的资料中写明,必须上机调试通过。 3、按《数据结构课程设计大纲》中的要求完成课程设计报告格式. 4、设计结束后,上交如下材料: 1)《课程设计报告》打印稿一份 2)课程设计的源代码电子文档一份

(设计题目) 摘要: 设计一个程序,根据任一数列生成一棵二叉排序树;实现基本的遍历方法;查询结点并删除结点且保证仍为二叉排序树.具体要求:用顺序和二叉链表作存储结构,输入数列L,以回车('\n')为输入结束标志生成一棵二叉排序树T;对二叉排序树T作中序遍历,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,否则输出信息“无x”。根据二叉排序树的概念,查找当前插入的元素的位置;删除结点如果不是叶子结点,要注意考虑如何使树仍为二叉排序树。

关键词: 二叉排序树,二叉链表,遍历,查询,删除 目录 1。设计背景 (4) 1。1 问题的提出 (4) 1.2 任务与分析 (5) 2。设计方案 (5) 2.1整体设计方案 (5) 3。方案实施 (6) 3.1主程序模块设计方案 (6) 3.2初始化模块设计方案 (6) 1)。实现二叉树的初始化 (6) 2)。创建一棵二叉树: (7) 3。3中序遍历模块设计方案: (8)

3。4 查找并删除元素模块设计方案 (9) 1)查找元素x: (9) 2) 删除元素x: (10) 3.5 主函数设计方案 (12) 4. 结果与结论 (14) 4。1结果演示 (14) 4。2结果演示 (15) 5. 收获与致谢 (15) 5。1总结: (15) 5.2致谢: (16) 6. 参考文献 (16) 7。附件 (16) 7.1源程序: (16) 1。设计背景 1.1 问题的提出 根据自己的知识功底和能力水平,选择二叉排序树的实现问题.而随着计算机发展并逐渐成为各行业不可缺少的东西,数据结构与算法包含计算机科学与技术的许多重要方面,对训练学生编出质量高、风格好的程序,又语言的发展,C++已成为用处最为广泛的语言.该设计运用数据结构知识,利用C++编写,来锻炼和提高我自己的编程及独立解决问题的能力,故选较为基础,但知识点广泛的题目.

相关文档
最新文档