文档库 最新最全的文档下载
当前位置:文档库 › 动态查找表(二叉排序树)

动态查找表(二叉排序树)

动态查找表(二叉排序树)
动态查找表(二叉排序树)

北京理工大学珠海学院计算机学院课程设计

动态查找表

摘要

数据结构是研究与数据之间的关系 我们称这一关系为数据的逻辑结构 简

称数据结构。当数据的逻辑结构确定以后 数据在物理空间中的存储方式 称为数据的存储结构。相同的逻辑结构可以具有不同的存储结构 因而有不同的算法。本次课程设计 程序中的数据采用“树形结构”作为其数据结构。具体采用

的是“二叉排序树” 并且使用“二叉链表”来作为其存储结构。本课程设计实现了二叉排序树的创建、中序遍历、插入、查找和删除二叉排序树中某个结点。本课程主要实现动态查找表的功能 通过“二叉排序树”的算法和“二叉链

表”的存储结构来实现。本课程设计说明书重点介绍了系统的设计思路、总体设计、各个功能模块的设计与实现方法。

关键词 数据结构 C语言二叉排序树动态二叉链表

1

2

目录

摘要 (1)

1ABSTRACT (3)

2

3抽象数据类型动态查找表定义 (4)

4

3 系统总体分析 (5)

3.1系统模块划分 (5)

3.2 二叉树的生成过程 (5)

3.3 主要功能模块设计 (5)

3.4 系统详细设计 (7)

3.4.1 主函数菜单模块 (7)

3.4.2 查找模块 (10)

3.4.3 删除模块 (11)

3.4.4 插入模块 (13)

3.4.5 中序输出模块 (15)

参考文献 (17)

心得体会 (18)

教师评语 (19)

附录 (20)

2

1 Abstract(摘要)

Data structure is the relationship between research and data, we call

this relationship as a logical data structure, referred to as data

structures. When the data logical structure is determined, the data stored

in the physical space, is known as the data storage structure. The same

logical structure can have different storage structure, which has a

different algorithm.

The curriculum design, program data is "tree" as its data structure.

Specific uses "binary sort tree" and use "binary list" as its storage

structure. The course is designed to achieve a binary sort tree creation,

in-order traversal, insert, find and delete a binary sort tree nodes.

This course is mainly the function of dynamic look-up table, through

the "binary search tree" algorithm and "binary list" of storage structures.

This course is designed to highlight the system design concept, overall

design, each functional module design and implementation.

Keywords: C Language Data Structure Dynamic Binary Search Tree,

Binary List

3

2 抽象数据类型动态查找表定义

ADT DynamicSearchTable{

数据对象D D是具有相同特性的数据元素的集合。各个数据元素含有类型相同

可唯一标识数据元素的关键字。

数据关系R:数据元素同属一个集合。

基本操作P

InitDSTable(&DT);

操作结果 构造一个空的动态查找表DT。

DestroyDSTable &DT ;

初始条件 动态查找表DT存在。

操作结果 销毁动态查找表DT。

SearchDSTable DT key ;

初始条件 动态查找表DT存在 key为和关键字类型相同的给定值。

操作结果 若DT中存在其关键字等于key的数据元素 则函数值为该元素的

值或在表中的位置 否则为“空”。

InsertDSTable &DT e ;

初始条件 动态查找表DT存在 e为待插入的数据元素。

操作结果 若DT中不存在其关键字等于e的数据元素 则插入e到DT。DeleteDSTable &DT key ;

初始条件 动态查找表DT存在 key为和关键字类型相同的给定值。

操作结果 若DT中存在其关键字等于key的数据元素 则删除之。

InOrderTraverse(DT);

初始条件 动态查找表DT存在。

操作结果 按中序的次序输出DT中的每个结点数据值。

}ADT DynamisSearchTable

4

5

3 系统总体分析

3.1系统模块划分

二叉排序树是一种动态树表。

二叉排序树的定义 二叉排序树或者是一棵空树 或者是一棵具有如下性

质的二叉树

⑴若它的左子树非空 则左子树上所有结点的值均小于根结点的值

⑵若它的右子树非空 则右子树上所有结点的值均大于根结点的值

⑶左、右子树本身又各是一棵二叉排序树。

3.2 二叉树的生成过程

二叉排序树的生成 采用递归方式的边查找边插入的方式。如图

3.3 主要功能模块设计

程序主要设计了五个功能 首先是创建二叉排序树 完成后出现任务菜单

菜单中设计了六个模块 查找 删除 插入 中序输出 清屏和退出。

5

图2.3 主函数流程图

3.4 系统详细设计

3.4.1 主函数菜单模块

该模块功能主要是给用户提供清晰的可操作界面 易于人机操作 并能很好

的调用其他各模块 使程序更加优化 丝路更加清晰 结构更加明了 提高了程

序的实用性。其代码如下

#include "BinaryTree.h"

void main(){

BiTree T = NULL;

intarr[100];

int n, i, k;

int data;

InitBiTree(T);

printf("请输入结点数 ");

scanf("%d", &n);

printf("请输入数据 ");

for(i = 0; i< n; i++){

//输入要排序的数据

scanf("%d", &arr[i]);

}

for(i = 0; i< n; i++){

//构造二叉排序树

InsertBiTree(T,arr[i]);

}

printf("按中序输出 ");

InOrderTraverse(T); //调用中序输出函数 将二叉排序树按中序输出

printf("\n");

Z:{

//语句块 供用户选择操作

7

printf("\t\t---------------------------\n");

printf("\t\t| 功能菜单|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 1.查找数据|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 2.删除数据|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 3.插入数据|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 4.输出有序序列|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 5.清屏|\n");

printf("\t\t---------------------------\n");

printf("\t\t| 6.退出|\n");

printf("\t\t---------------------------\n\n");

X:{

//该语句块用于循环选择

printf("请输入选择功能的序号 ");

V:{

//该语句块用于输入序号错误时重新输入

scanf("%d", &k);

}//end V

switch(k){

case 1:

printf("请输入要查找的数据 ");

scanf("%d", &data);

if(InsertBiTree(T, data)){

printf("不存在数据元素%d\n", data);

}

else{

8

printf("存在数据元素%d\n", data);

}

break;

case 2:

printf("请输入要删除的数据 ");

scanf("%d", &data);

if(!DeleteBiTree(T, data)){

printf("不存在要输出的数据%d\n", data);

}

else{

printf("删除操作成功\n");

}

break;

case 3:

printf("请输入要插入的数据 ");

scanf("%d", &data);

if(!InsertBiTree(T, data)){

printf("要插入的数据%d已存在 插入失败\n", data);

}

else{

printf("插入操作成功\n");

}

break;

case 4:

printf("有序序列为 ");

InOrderTraverse(T);

printf("\n");

break;

case 5:

system("cls");

9

10

goto Z;

break;

case 6:

DestroyBiTree(T);

exit(0);

default:

printf("输入字符错误 请重新输入:");

goto V;

}//end switch

printf("\n\n");

}//end X

goto X;

}//end Z

}

图2.4.1

3.4.2 查找模块

该模块是给用户提供查找功能。其查找过程是 若二叉排序树为空 则查找失败 结束查找 返回信息NULL 否则 将要查找的值与二叉排序树根结点的值进行比较 若相等 则查找成功 结束查找 返回被查找到结点的地址 若不等 则根据要查找的值与根结值的大小关系决定时到根结点的左子树还是右子树中继续查找 查找过程同上 直到查找成功或者查找失败为止。其代码如下:

Status SearchBiTree(BiTree T, Elem key, BiTree f, BiTree&p){

//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据

元素

//若查找成功 则指针p指向该数据元素结点 并返回TRUE 否则

指针p

//指向查找路径上访问的最后一个结点并返回FALSE 指针f指向T

的双亲 其初始调用值为NULL

if(!T){

p = f;

return FALSE; //查找不成功

}

else if(key == T->data){

p = T;

return TRUE; //查找成功

}

else if(key < T->data){

//在左子树中继续查找

return (SearchBiTree(T->left, key, T, p));

}

else {

//在右子树中继续查找

return (SearchBiTree(T->right, key, T, p));

}

}

图2.4.2

3.4.3 删除模块

删除结点函数 采用边查找边删除的方式。如果没有查找到 则不对树做任何的修改;如果查找到结点 则分四种情况分别进行讨论

A 该结点左右子树均为空 可以直接进行删除

B 该结点仅左子树为空 右子树不为空 用右子树的根结点取代被删除结

点的位置

C 该结点仅右子树为空 左子树不为空

D 该结点左右子树均不为空 找到被删除结点左子树中最大的结点 并用

该结点取代被删除节点的位置。其代码如下

Status Delete(BiTree&p){

//从二叉排序树中删除结点p 并重接它的左或右子树

BiTree q, s;

//q = (BiTree)malloc(sizeof(BiTree));

//s = (BiTree)malloc(sizeof(BiTree));

if(!p->right){

//右子树为空则重接它的左子树

q = p;

p = p->left;

q->left = NULL;

// free(q); 有错误

}

else if(!p->left){

//只需重接它的右子树

q = p;

p = p->right;

q->right = NULL;

// free(q); //有错误

}

else{

//左右子树都不空

q = p;

s = p->left;

while(s->right){

q = s;

s = s->right; //转右 然后向右走到尽头 找到被删点的“前

驱”

}

p->data = s->data; //s指向被删结点的“前驱”

s->data = NULL;

if(q != p){

q->right = s->left; //重接*q的右子树

}

else{

q->left = s->left; //重接*q的左子树任何的修改 如果查找到结点 则分四种情况分别进行讨论

A 该结点左右子树均为空 可以直接进行删除

B 该结点仅左子树为空 右子树不为空 用右子树的根结点取代被删除结

点的位置

C 该结点仅右子树为空 左子树不为空

D 该结点左右子树均不为空 找到被删除结点左子树中最大的结点 并用

该结点取代被删除节点的位置。其代码如下

Status Delete(BiTree&p){

//从二叉排序树中删除结点p 并重接它的左或右子树

BiTree q, s;

//q = (BiTree)malloc(sizeof(BiTree));

//s = (BiTree)malloc(sizeof(BiTree));

if(!p->right){

//右子树为空则重接它的左子树

q = p;

p = p->left;

q->left = NULL;

// free(q); 有错误

}

else if(!p->left){

//只需重接它的右子树

q = p;

p = p->right;

q->right = NULL;

// free(q); //有错误

}

else{

//左右子树都不空

q = p;

s = p->left;

while(s->right){

q = s;

s = s->right; //转右 然后向右走到尽头 找到被删点的“前驱”

}

p->data = s->data; //s指向被删结点的“前驱”

s->data = NULL;

if(q != p){

q->right = s->left; //重接*q的右子树

}

else{

q->left = s->left; //重接*q的左子树

}

// free(s); 有错误

}

return TRUE;

}

Status DeleteBiTree(BiTree&T, Elem key){

//若二叉排序树T中存在关键字等于key的数据元素时

//则删除该数据元素结点 并返回TRUE 否则返回FALSE

if(!T){

return FALSE; //不存在关键字等于key的数据元素

}

else{

if(key == T->data){

return Delete(T); //找到关键字等于key的数据元素

}

else if(key <= T->data){

//从左子树继续查找等于key的数据元素

return DeleteBiTree(T->left, key);

}

else{

//从右子树继续查找等于key的数据元素

return DeleteBiTree(T->right,key);

}

}

}

图2.4.3

3.4.4 插入模块

在二叉排序树种插入新结点 要保证插入后的二叉树仍符合二叉排序树的

定义。插入过程 若二叉排序树为空 则待插入结点*p作为根结点插入到空树

中 当非空时 将待插结点关键字p->item和树根关键字t->item进行比较

若p->item=t->item 则无须插入 若p->itemitem 则插入到根的左子

树中 若p->item>t->item 则插入到根的右子树中。而子树种的插入过程和

在树中的插入过程相同 如此进行下去 直到把结点*p作为一个新的树叶插入

到二叉排序树中 或者直到发现数已有相同关键字的结点为止。其代码如下 Status InsertBiTree(BiTree&T, Elem key){

//当二叉排序树T中不存在关键字等于key的数据元素时 插入key并返回TRUE //否则返回FALSE

BiTree s = NULL;

BiTree p = NULL;

if(!SearchBiTree(T, key, NULL, p)){

s = (BiTree)malloc(sizeof(BiTree));

if(!s){

//内存分配失败时给出提示 然后退出操作

printf("内存空间分配失败 \n");

exit(OVERFLOW);

}

s->data = key;

s->left = s->right = NULL;

if(!p){

T = s;

}

else if(key < p->data){

p->left = s;

}

else{

p->right = s;

}

return TRUE;

}

else

return FALSE;

}

图2.4.4

3.4.5 中序输出模块

遍历 Traversal 是指沿着某条搜索路线 依次对树中每个结点均做一

次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。二叉树共有三个部分组成 即根结点 根结点的左子树 根结点的右子树。限定以从左至右方式共有三种遍历方式 即前序遍历 中序遍历 后序遍历。中序遍历的原则 若被遍历的二叉树为非空 则依次执行如下操作

A 以中序遍历方式遍历左子树

B 访问根结点

C 以中序遍历方式遍历右子树。其代码如下

Status InsertBiTree(BiTree&T, Elem key){

//当二叉排序树T中不存在关键字等于key的数据元素时 插入key并返

回TRUE

//否则返回FALSE

BiTree s = NULL;

BiTree p = NULL;

if(!SearchBiTree(T, key, NULL, p)){

s = (BiTree)malloc(sizeof(BiTree));

if(!s){

//内存分配失败时给出提示 然后退出操作

printf("内存空间分配失败 \n");

exit(OVERFLOW);

}

s->data = key;

s->left = s->right = NULL;

if(!p){

T = s;

}

else if(key < p->data){

p->left = s;

}

else{

p->right = s;

}

return TRUE;

}

else

return FALSE;

}

图2.4.5

16 北京理工大学珠海学院计算机学院课程设计

参考文献

[1]屈婉玲耿素云张立昂 《离散数学》[M] 清华大学出版社2008年版

第199页。

[2]严蔚敏吴伟民 《数据结构 C语言版 》[M] 清华大学出版社2010 年版 227-232页。

[3]Thomas H.Cormen Charles E.Leiserson Ronald L.Risest

Clifford Stein :《算法导论》,机械工业出版社2010年版 151-155页。

[4]谭浩强 《C语言程序设计》 清华大学出版社2009年版 120-135页。

[5]Brain W.Kernighan Dennis M.Ritchie 《C程序设计语言》 机械

工业出版社2005年版 111-113页。

北京理工大学珠海学院计算机学院课程设计

心得体会

通过这次课程设计我也着实又感受了一次编程的乐趣 从中也学到了不

少知识。我在学习运用数据结构编程之前 并未能深刻体会到这一点 直到

这次课程设计 我才有所领悟。

这次实验中我也出现过一些比较严重的错误。比如没有将改变后的二叉

树的头指针返回 导致结果错误。这是我对基本概念理解的模糊不清造成的。

后来经过查资料我意识到自己的错误。不过收获也很不少。

另外程序的不足之处是不能没有使用free()函数动态销毁掉动态分配的

空间。

总之 我会继续我的兴趣编写程序的 相信在越来越多的尝试之后 自

己会不断进步不断提高。

18

二叉排序树的基本操作的实现

二叉排序树的基本操作的实现

————————————————————————————————作者: ————————————————————————————————日期:

二叉排序树的基本操作的实现

一设计要求 1.问题描述 从磁盘读入一组数据,建立二叉排序树并对其进行查找、、遍历、插入、删除等基本操作。 2.需求分析 建立二叉排序树并对其进行查找,包括成功和不成功两种情况。 二概要设计 为了实现需求分析中的功能,可以从以下3方面着手设计。 1.主界面设计 为了方便对二叉排序树的基本操作,设计一个包含多个菜单选项的主控制子程序以实现二叉排序树的各项功能。本系统的主控制菜单运行界面如图1所示。 图1二叉排序树的基本操作的主菜单 2.存储结构的设计 本程序主要采二叉树结构类型来表示二叉排序树。其中二叉树节点由1个表示关键字的分量组成,还有指向该左孩子和右孩子的指针。 3.系统功能设计 本程序设置了5个子功能菜单,其设计如下。 1)建立二叉排序树。根据系统提示,输入节点的关键字,并以0作为结束的标识符。 该功能由Bstree Create()函数实现。 2)插入二叉排序新的节点信息。每次只能够插入一个节点信息,如果该节点已 经存在,则不插入。该功能由Bstree Insert(y)函数实现。 3)查询二叉排序树的信息。每次进行查询,成功则显示“查询到该节点”,不成功 则“显示查询不到该节点“该功能由Bstree Search()函数实现。 4)删除二叉排序树的节点信息。可以对二叉排序树中不需要的节点进行删除, 删除的方式是输入关键字,查询到该节点后删除。该功能由BstreeDelete() 函数实现。 5)遍历二叉排序树。遍历二叉排序树可以显示该二叉排序树的全部节点信息。 该功能由void Traverse()实现。 三模块设计 1.模块设计 本程序包含两个模块:主程序模块和二叉排序树操作模块。其调用关系如图2

二叉排序树的建立及遍历的实现

课程设计任务书 题目: 二叉排序树的建立及遍历的实现 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能: (1)建立二叉排序树; (2)中序遍历二叉排序树并输出排序结果; 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日 排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据 组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。 关键字:排序二叉树,先序遍历,中序遍历,后序遍历 0.引言 我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。 该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归 调用,这将极大的方便算法设计。 1.需求分析 建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。 该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。 2.数据结构设计 本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

二叉排序树算法

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计课程设计题目:二叉排序树算法 院(系):计算机学院 专业:计算机科学与技术 班级:04010103 学号:2010040101097 姓名:郭胜龙 指导教师:丁一军

此页为任务书

目录 1 课程设计介绍 (1) 1.1课程设计内容 (1) 1.2课程设计要求 (1) 2 课程设计原理 (2) 2.1课设题目粗略分析 (2) 2.2原理图介绍 (2) 2.2.1 功能模块图 (2) 2.2.2 main(主函数) (2) 2.2.3 SearchBST(查找) (3) 2.2.4 InsertBST(插入) (4) 2.2.5 CreatBST(建立) (4) 2.2.6 DeleteBST(删除) (4) 2.2.7 PreOrder(先序遍历) (5) 2.2.8 InOrder(中序遍历) (5) 3 数据结构分析 (7) 3.1存储结构 (7) 3.2算法描述 (7) 4 调试与分析 (12) 4.1调试过程 (12) 4.2程序执行过程 (12) 参考文献 (15) 附录(关键部分程序清单) (16)

沈阳航空航天大学课程设计报告 1 课程设计介绍 1.1 课程设计内容 题目内容: 1.构造二叉排序树; 2.输出该二叉排序树的先序、中序遍历序列; 3.删除该二叉排序树的任意一个结点; 4.输出删除后的二叉排序树的先序、中序遍历序列。 1.2课程设计要求 题目要求: 1.按要求建立不同的二叉排序树; 2.数据自定 3.独立完成课程设计任务

2 课程设计原理 2.1 课设题目粗略分析 根据课设题目要求,拟将整体程序分为七大模块。以下是七个模块的大体分 析: main ():主函数模块 SearchBST ():查找相应的结点 InsertBST1():插入一个新的结点 CreatBST ():创建一棵二叉排序树 DeleteNode ():删除结点 PreOrder ()对二叉排序树进行先序遍历 InOrder ()对二叉排序树进行中序遍历 2.2 原理图介绍 2.2.1 功能模块图 图2.2.1 功能模块结构图 2.2.2 main (主函数) 功能:连接各个函数,确定他们的执行顺序和条件。 二叉排 序树算法 主模块 查找模块 插入模块 建立模块 删除模块 先序遍历模块 中序遍历模块

实现二叉排序树的各种算法

wyf 实现二叉排序树的各种算法 一.需求分析 (1)系统概述: 本系统是针对排序二叉树设计的各种算法,提供的功能包括有:(1)插入新结点(2)前序、中序、后序遍历二叉树(3)中序遍历的非递归算法(4)层次遍历二叉树(5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) 二.总体设计 (1)系统模块结构图

(2)数据结构设计 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针} BiTNode,*BiTree; typedef BiTree SElemType; typedef BiTree QElemType; typedef struct {

QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; typedef struct { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; // 顺序栈 Status InitStack(SqStack &S) { // 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE // 请补全代码 S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) return (ERROR); S.top = S.base ;

实验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

二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计 名称 二叉排序树运算学生姓名顾成方 学号0704011033 专业班级08计科(2) 指导教师王昆仑张贯虹 2010 年 5 月

题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。 ⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。 一、问题分析和任务定义 本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。 实现本程序需要解决以下几个问题: 1、如何构造二叉排序树。 2、如何通过中序遍历输出二叉排序树。 3、如何实现多种查找。 4、如何实现插入删除等操作。 二叉排序树的定义:

⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。 ⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。 ⑶其左右子树也分别为二叉排序树。 本问题的关键在于对于二叉排序树的构造。根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。因此,插入算法还要包括对数据的查找判断过程。 本问题的难点在于二叉排序树的删除算法的实现。删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确

《算法设计与分析》--最优二叉排序树

《算法分析与设计》 实验报告 题目: 姓名: 班级: 学号: 指导教师: 完成时间:

一、实验题目 给定一系列键值和权重,构造最优二叉排序树,使得总的查找次数最少。 二、实验目的 1. 理解时间复杂度的概念。 2. 深入地掌握C语言编程。 3. 通过编程直观地理解算法分析的意义 三、实验要求 给定一系列键值和权重,构造最优二叉排序树,使得总的查找次数最少。要求的输出格式为:第一行为最优的查找次数,第二行为最优二叉排序树的前序遍历得到的序列,然后一个空行,随后为源代码。算法的输入如下(冒号前为键值,冒号后为权重):1:0 2:56 3:19 4:80 5:58 6:47 7:35 8:89 9:82 10:74 11:17 12:85 13:71 14:51 15:30 16:1 17:9 18:36 19:14 20:16 21:98 22:44 23:11 24:0 25:0 26:37 27:53 28:57 29:60 30:60 31:16 32:66 33:45 34:35 35:5 36:60 37:78 38:80 39:51 40:30 41:87 42:72 43:95 44:92 45:53 46:14 47:46 48:23 49:86 50:20 51:77 52:84 53:99 54:99 55:61 56:39 57:26 58:29 59:84 60:2 61:37 62:9 63:67 64:5 65:0 66:91 67:27 68:27 69:58 70:69 71:83 72:72 73:48 74:20 75:74 76:46 77:45 78:94 79:74 80:10 81:59 82:38 83:73 84:60 85:57 86:36 87:15 88:22 89:42 90:80 91:51 92:98 93:75 94:34 95:16 96:65 97:49 98:6 99:69 100:50 101:14 102:94 103:14 104:90 105:69 106:30 107:42 108:7 109:96 110:68 111:15 112:87 113:82 114:58 115:19 116:17

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

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩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 compare()对数组和二叉排序树的查找效率进行比较比 较。 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插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

《二叉排序树的操作》课程设计报告

内蒙古科技大学 本科生课程设计论文《数据结构与算法》 题目:二叉排序树的操作 学生姓名:贺英杰 学号:1367159108 专业:软件工程 班级:13-1班 指导教师:周李涌 日期:2015年1月6日

内蒙古科技大学课程设计任务书课程名称数据结构与算法课程设计 设计题目二叉排序树的操作 指导教师周李涌时间2015.1.5——2015.1.9 一、教学要求 1. 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力 2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能 3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力 4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风 二、设计资料及参数 每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。 二叉排序树的操作 以二叉链表表示二叉排序树,在此基础上实现二叉排序树的操作。 要求设计类(或类模板)来描述二叉排序树,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数: 创建二叉排序树 输出二叉排序树 在二叉排序树中查找给定值 在二叉排序树中插入新结点 在二叉排序树中删除给定值 并设计主函数测试该类(或类模板)。 三、设计要求及成果 1. 分析课程设计题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 5. 设计完成后提交课程设计报告 四、进度安排 资料查阅与讨论(1天) 系统分析(2天) 系统的开发与测试(5天) 编写课程设计说明书和验收(2天) 五、评分标准 1. 根据平时上机考勤、表现和进度,教师将每天点名和检查 2. 根据课程设计完成情况,必须有可运行的软件。 3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。 4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问 六、建议参考资料 1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11 2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社 2007.2 3.《数据结构:用面向对象方法与C++语言描述》,殷人昆主编,清华大学出版社 2007.6

数据结构课程设计---二叉排序树和平衡二叉树的判别

数据结构课程设计---二叉排序树和平衡二叉树的判别

二叉排序树和平衡二叉树的判别 1引言 数据结构是软件工程的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数据模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,在进行编程调试,最后获得问题的解答。 本次课程设计的题目是对二叉排序树和平衡二叉树的扩展延伸应用。首先我们得建立一个二叉树,二叉树有顺序存储结构和链式存储结构两种存储结构,此次我选用的是二叉链表的存储结构。对于判断平衡二叉树,需要求出其每个叶子结点所在的层数,这里我采用的边遍历边求的方式,遍历采用的是先序遍历。二叉树的建立以及二叉排序树和平衡二叉树的判别中都用到了递归思想。 2需求分析 2.1在日常生活中,人们几乎每天都要进行“查找”工作。所谓“查找”即为 在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录),即关键字。 2.2本程序意为对一个已经建立的动态查找表——二叉树——判断其是否是二 叉排序树和平衡二叉树。 3数据结构设计 3.1抽象数据类型二叉树的定义如下: ADT BinaryTree{ 3.1.1数据对象D:D是具有相同特性的数据元素的集合。 3.1.2数据关系R: 若D=NULL,则R=NULL,称BinaryTree为空的二叉树; 若D!=NULL,则R={H},H是如下的二元关系: 3.1.2.1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; 3.1.2.2若D-{root}!=NULL,则存在D-{root}={Dl,Dr},且Dl与Dr相交为空; 3.1.2.3若Dl!=NULL,则Dl中存在唯一的元素xl,属于H,且存在Dl上的关系Hl属于H;若Dr!=NULL,则Dr中存在唯一的元素xr,

二叉树的各种算法

二叉树的各种算法.txt男人的承诺就像80岁老太太的牙齿,很少有真的。你嗜烟成性的时候,只有三种人会高兴,医生你的仇人和卖香烟的。 /*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十七行:二叉树的深度 第十八行:叶子结点数 */ #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

#define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(keydata)return SearchBST(T->lchild,key,T,p); else return(SearchBST(T->rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p; if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(edata)p->lchild=s; else p->rchild=s; return TRUE; } else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e的值 printf("%d ", e ); return OK; }// PrintElement

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

《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为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.1树的概念 树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树 1.树的度——也即是宽度,简单地说,就是结点的分支数。以组成该树各结点中最大的度作为该树的度,如上图的树,其度为3;树中度为零的结点称为叶结点或终端结点。树中度不为零的结点称为分枝结点或非终端结点。除根结点外的分枝结点统称为内部结点。 2.树的深度——组成该树各结点的最大层次,如上图,其深度为4; 3.森林——指若干棵互不相交的树的集合,如上图,去掉根结点A,其原来的二棵子树T1、T2、T3的集合{T1,T2,T3}就为森林; 4.有序树——指树中同层结点从左到右有次序排列,它们之间的次序不能互换,这样的树称为有序树,否则称为无序树。 5.树的表示 树的表示方法有许多,常用的方法是用括号:先将根结点放入一对圆括号中,然后把它的子树由左至右的顺序放入括号中,而对子树也采用同样的方法处理;同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。如上图可写成如下形式: (A(B(E(K,L),F),C(G),D(H(M),I,J))) 5. 2 二叉树 1.二叉树的基本形态: 二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全二叉树——(e) 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。 2.两个重要的概念: (1)完全二叉树——只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树; (2)满二叉树——除了叶结点外每一个结点都有左右子女且叶结点都处在最底层的二叉树,。 如下图: 完全二叉树 1页

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列*\n"); printf(" *2:进行删除操作

*\n"); printf(" *3:退出*\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果 (3)中序遍历模块 void view(LNode p){

实验报告 实验三 二叉排序树的建立和查找

实验三二叉排序树的建立和查找 一、实验目的 1.掌握二叉排序树的建立算法 2.掌握二叉排序树查找算法。 二、实验环境 操作系统和C语言系统 三、预习要求 复习二叉排序树的生成及查找算法,编写完整的程序。 四、实验内容 实现二叉排序树上的查找算法。具体实现要求:用二叉链表做存储结构,输入键值序列,建立一棵二叉排序树并在二叉排序树上实现查找算法。 五、参考算法 #include #include typedef int InfoType; typedef int KeyType; /*假定关键字类型为整数*/ typedef struct node /*结点类型*/ { KeyType key; /*关键字项*/ InfoType otherinfo; /*其它数据域,InfoType视应用情况而定,下面不处理它*/ struct node *lchild,*rchild; /*左右孩子指针*/ }BSTNode; typedef BSTNode *BSTree; /*BSTree是二叉排序树的类型*/ BSTNode *SearchBST(BSTree T,KeyType key) { /*在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NULL*/ if(T==NULL||key==T->key) /*递归的终结条件*/ return T; /*若T为空,查找失败;否则成功,返回找到的结点位置*/ if(keykey) return SearchBST(T->lchild,key);

else return SearchBST(T->rchild,key); /*继续在右子树中查找*/ } void InsertBST(BSTree *T,int key) { /*插入一个值为key的节点到二叉排序树中*/ BSTNode *p,*q; if((*T)==NULL) { /*树为空树*/ (*T)=(BSTree)malloc(sizeof(BSTNode)); (*T)->key=key; (*T)->lchild=(*T)->rchild=NULL; } else { p=(*T); while(p) { q=p; if(p->key>key) p=q->lchild; else if(p->keyrchild; else { printf("\n 该二叉排序树中含有关键字为%d的节点!\n",key); return; } } p=(BSTree)malloc(sizeof(BSTNode)); p->key=key; p->lchild=p->rchild=NULL; if(q->key>key) q->lchild=p; else q->rchild=p; } } BSTree CreateBST(void) { /*输入一个结点序列,建立一棵二叉排序树,将根结点指针返回*/

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

学号 数据结构课程设计 设计说明书 排序二叉树的遍历 起止日期:2011 年12月12日至2011 年12月16日 学生姓名 班级 成绩 指导教师(签字) 电子与信息工程系 2011年12月16日

天津城市建设学院 课程设计任务书 2011 —2012 学年第二学期 电子与信息工程系软件工程专业班级 课程设计名称:数据结构课程设计 设计题目:排序二叉树的遍历 完成期限:自2011 年12月12 日至2011 年12月16 日共 1 周 设计依据、要求及主要内容(可另加附页): 一、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 二、设计要求 (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务; (2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩; (3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表; (4)认真编写课程设计报告。 三、设计内容 排序二叉树的遍历(用递归或非递归的方法都可以) 1)问题描述 输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。 2)基本要求 (1)用菜单实现

(2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。 四、参考文献 1.王红梅.数据结构.清华大学出版社 2.王红梅.数据结构学习辅导与实验指导.清华大学出版社 3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社 指导教师(签字): 教研室主任(签字): 批准日期: 2011 年 12 月 17 日 主要内容: 一、需求分析: 输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。 我自己的思想:首先设想把源程序分成头文件,调用和主函数三部分。在头文件中申明类和定义结构体,把先序,中序,后序,层次和叶子节点数的函数定义在类中。然后在调用文件中,把几个函数的实现定义写在里面。最后在主函数中把输出结果以菜单的样式输出来的方式写完主函数程序。实现的过程是先想好自己要输入的是什么,然后通过输入节点制,判断其是否是满足前序遍历,满足则可以实现下后面的功能。 二、问题求解: 现实中的问题:给同学排队问题。 层次是从头开始每一层一层的排,然后分别记号码。 前序是先从最上面的那一个开始往左手边开始排,排之前先计算好人数,然后开始排,排玩左边排右边。 中序是先从最左边开始,然后左斜上角,然后右下角,再左斜上角,直到最上层为止,然后安这个顺序继续排右边的。 后序是先从最左边开始的,左边的一次排过来,然后直接排右边的,也是安依次的顺序,最后才是最上层的。

二叉排序树与平衡二叉排序树基本操作的实现

编号:B04900083 学号:8 Array课程设计 教学院计算机学院 课程名称数据结构与算法 题目二叉排序树与平衡二叉排序树基本操 作的实现 专业计算机科学与技术 班级二班 姓名 同组人员 指导教师成俊 2015 年12 月27 日

课程设计任务书 2015 ~2016 学年第 1 学期 学生:专业班级:计科二 指导教师:成俊工作部门:计算机学院 一、课程设计题目:二叉排序树与平衡二叉排序树基本操作 二、课程设计容 用二叉链表作存储结构,编写程序实现二叉排序树上的基本操作:以回车('\n')为输入结束标志,输入数列L,生成二叉排序树T;对二叉排序树T作中序遍历;计算二叉排序树T的平均,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历;否则输出信息“无结点x”; 判断二叉排序树T是否为平衡二叉树;再用数列L,生成平衡二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;计算平衡的二叉排序树BT的平均查找长度,输出结果。 三、进度安排 1.分析问题,给出数学模型,选择数据结构. 2.设计算法,给出算法描述 3.给出源程序清单 4. 编辑、编译、调试源程序 5. 撰写课程设计报告 四、基本要求 编写AVL树判别程序,并判别一个二叉排序树是否为AVL树。二叉排序树用其先序遍历结果表示,如:5,2,1,3,7,8。 实现AVL树的ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二叉排序树转变为AVL树的操作。 实现提示主要考虑树的旋转操作。

目录 一、课程设计题目: 二叉排序树与平衡二叉排序树基本操作 (1) 二、课程设计容 (1) 三、进度安排 (1) 四、基本要求 (1) 一、概述 (3) 1.课程设计的目的 (3) 2.课程设计的要求 (3) 二、总体方案设计 (4) 三、详细设计 (6) 1.课程设计总体思想 (6) 2.模块划分 (7) 3.流程图 (8) 四、程序的调试与运行结果说明 (9) 五、课程设计总结 (14) 参考文献 (14)

基于二叉排序树的商品信息查询算法的设计与实现-final

基于二叉排序树的商品信息查询算法的设计与实现 数据结构实验报告五 信计162班 刘禹熙· 160279

【实验学时】6学时 【实验目的】 熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。 【问题描述】 查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。 【基本要求】 (1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。 (2)根据给定的数据建立平衡二叉树。 (3)比较二叉排序树和平衡二叉树的平均查找长度。 【测试数据】 随机生成。 【实现提示】 (1)初始,二叉排序树和平衡二叉树都为空树,操作界面给出查找、插入和删除三种操作供选择。每种操作均要提示输入关键字。每 次插入或删除一个结点后,应更新平衡二叉树或二叉排序树的显示。 (2)平衡二叉树或二叉排序树的显示可以采用凹入表形式,也可以采用图形界面画出树形。 【概要设计】 1.定义二叉树存储结构类型 ADT BiTree{ int data//每个树结点存放的数据值 BiTree *lchild,*rchild;//分支结点 函数类型: Bool searchBST(T,key,f,p) 操作结果:查找树T中是否有值为key的结点并让指针p指向该树根结点。 Bool insertBST(T,key) 操作结果:在树中插入尚未存在的结点权值为key的结点,若已有该节点则不插入。 Bool deleteBST(T,key) 操作结果:在树T中删除结点权值为key 的结点,若结点不存在则,返回false。 Void Tree_printing(T,ss) 操作结果,在距屏幕左侧ss的地方凹入法打印已经存储的二叉树。 } 2.main函数说明 功能包括:R:用伪随机发生成100个结点的商品二叉树,并用凹入法打印新生成的二叉树 C:创建二叉树,可以批量添加结点; I:创建一个二叉树结点,若结点存在则不插入,若不存在则插入,并打印插入后的二叉树

二叉树排序算法

实验报告 课程名称:数据结构实验课程 实验四、串的基本操作练习 一、实验目的 1. 掌握二叉树的存储实现 2. 掌握二叉树的遍历思想 3. 掌握二叉树的常见算法的程序实现 二、实验环境 VC++6.0 三、实验内容 1.输入字符序列,建立二叉树的二叉链表结构。(可以采用先序序列) 2.实现二叉树的先序、中序、后序的递归遍历算法。 3.实现二叉树的先序、中序、后序的非递归遍历算法。 4.求二叉树的高度。 5.求二叉树的结点个数。 6.求二叉树的叶子结点的个数。 四、实验要求: 分别编写实现上述算法的子函数,并编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述子函数。 五、实验步骤和结果 1.打开vc,新建文本,命名二叉树算法,编写代码。 2.编写代码: #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int i=0; /*--------------------------------------建立堆栈------------------------------------------*/ typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; } BiTNode,*BiTree;//树类型 typedef struct SqStack {

BiTNode *base; BiTNode *top; int stacksize; } SqStack;//栈类型 void InitStack(SqStack *S)//创建二叉树 { S->base=(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } void Push(SqStack *S,BiTNode e)//进栈 { if(S->top - S->base >= S->stacksize)//如果栈空间不足 { S->base=(BiTNode*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(B iTNode)); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *(S->top)=e; S->top++; } BiTNode Pop(SqStack *S)//出栈 { S->top --; return *S->top; } int StackEmpty(SqStack *S)//判断栈是否非空 { if(S->top == S->base ) return 1; else return 0; } /*---------------------------------------------递归部分-------------------------------------------*/

相关文档
相关文档 最新文档