文档库 最新最全的文档下载
当前位置:文档库 › 在二叉排序树中查找关键字为key地记录簿

在二叉排序树中查找关键字为key地记录簿

在二叉排序树中查找关键字为key地记录簿
在二叉排序树中查找关键字为key地记录簿

学院名称专业班级实验成绩学生姓名学号实验日期课程名称数据结构实验题目 4 查找

一、实验目的与要求

通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。

二、主要仪器设备

Cfree

三、实验内容和原理

2.实习题1

[问题描述]

编写程序实现下面运算:在二叉排序树中查找关键字为key的记录。

[输入]

排序二叉树,以及要查找的数字(节点)。

[输出]

显示该节点是否存在。

[存储结构]

有序表采用顺序方式存储。

[算法的基本思想]

若二叉排序树为空树,查找失败,返回null或0;

否则,将key与根节点的关键字比较:

若key=根节点的关键字,查找成功;

若key<根节点的关键字,继续在左子树中查找;

若key>根节点的关键字,继续在右子树中查找。

[参考源程序]

#include

#include

#define NULL 0

typedef int KeyType;

typedef struct {

KeyType key;

}ElemType; //元素类型

typedef struct BiTNode{

ElemType data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

BiTree searchBST(BiTree bt,KeyType key){

/*在二叉排序树bt 中查找其关键字等于给定值的结点是否存在,并输出相应信息*/ if (bt==NULL) return NULL;//在排序二叉树中进行递归查找

else if (bt->data.key==key) return bt;

else if (keydata.key) return searchBST(bt->lchild,key);

else return searchBST(bt->rchild,key);

}

void insertBST(BiTree *bt,BiTree s){

/*在二叉排序树中插入一个新结点,即依次插入输入的数*/

if (*bt==NULL) *bt=s;

else if (s->data.key<(*bt)->data.key) insertBST(&((*bt)->lchild),s);

else if (s->data.key>(*bt)->data.key) insertBST(&((*bt)->rchild),s);

}

main(){

char ch;

KeyType key;

BiTree bt,s;

int i=0;

/*建立一棵二叉排序树,元素从键盘按先序输入,直到输入关键字等于-1为止*/ printf("\n请输入元素(-1:结束):\n");//以-1为结束

scanf("%d",&key);

bt=NULL;

while (key!=-1){

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

(s->data).key=key;s->lchild=s->rchild=NULL;

insertBST(&bt,s);

scanf("%d",&key);

}//while

/*二叉排序树的查找,可多次查找,并输出查找的结果*/

do {

printf("\n输入你想要查找的元素:");

scanf("%d",&key);

s=searchBST(bt,key);

if (s!=NULL) printf("\n成功! 这个等价元素是%d.\n",s->data.key);

else printf("\n没有找到!\n");

printf("\n是否继续?(y/n):");

scanf("%c",&ch);

ch=getchar();

}

while (ch=='y' || ch=='Y') ;

getchar();

}//main

实验结果:

五、实验结果与分析

(2)习题1:采用先序遍历的方式生成二叉树,程序中多次使用的递归的算法。使程序看起来很简洁。如果把头结点的生成也放到生成树的函数中,会使程序看起来更加调理。

六、实验心得及体会

查找是很多程序的基础,很多程序中都会用到查找。比如在线性表的插入和删除时要查找合适的位置。所以学好查找是很必要的。本次实验只要是采取了这般查找的方法。其实还有很多查找的方法。如顺序查找,索引顺序表查找。每种查找方法各有优劣。如折半查找的平均查找长度小于顺序查找,但它要求查找的表为有序的。所以需将无序表排序成有序表。这又会浪费运行时间。编写程序时遇到了很多的困难,如先序生成树更好还是中序生成更好。

太原理工大学学生实验报告

学院名称计算机科学与技术专业班级计Z1002班实验成绩

学生姓名郑海兵学号2010001420 实验日期1月2日

课程名称数据结构实验题目 5 内排序

一、实验目的与要求

通过本次实验,掌握线性表的排序方法,并分析时间复杂度。

二、主要仪器设备

Cfree

三、实验内容和原理

[问题描述]

设计一个用链表表示的直接选择排序算法,并用程序实现。

[输入]

n个数据。

[输出]

n个数据由小到大排列的结果。

[存储结构]

待排序记录顺序存储。

[算法的基本思想]

已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。反复执行这个过程,直到排好序。

[参考源程序]

#include

#include

int n;

struct Number{

int data;

struct Number* next;

};

struct Number* Creat_H(int k){//创建单链表

struct Number* L;

struct Number* p;

p=(struct Number*)malloc(sizeof(struct Number));

L=p;

int temp;

int i;

printf("\n请输入元素:");

for(i=1;i<=k;i++){

scanf("%d",&temp);

p->data=temp;

if(i==k){

p->next=NULL;

break;

}

p->next=(struct Number*)malloc(sizeof(struct Number)); p=p->next;

}//for

return L;

}//struct Number* Creat_H

struct Number* Sort(struct Number* p){//直接选择排序struct Number* max;

struct Number* min;

struct Number* temp;

struct Number* r;

r=p;

int flag=0;

do{

if(flag==0){//第一次找最小数时的初始化temp=min=max=r;

}

else{

temp=min=max=r->next;

}//do

while(1){//找出最小数

if(min->data<=max->next->data){

if(max->next->next!=NULL){

max=max->next;

}

else{

break;

}

}//if

else{

temp=max;//相当于temp->next=min min=max->next;

if(max->next->next!=NULL){

max=max->next;

}

else{

break;

}

}//else

}//while(1)

if(temp!=min){

if(min->next==NULL){

temp->next=NULL;

}

else{

temp->next=min->next;

}

if(flag==0){

r=min;

r->next=p;

p=r;

}

else{

min->next=r->next;

r->next=min;

r=min;

}

}//if

else{//初始化时min就已经指向了最小数if(flag==0){//第一次找到最小数

r=min;

p=r;

}

else{

r=min;

}

}//else

flag++;//又排好一个数

if(flag==n-1){

return p;

}

}while(1);

}

int main(){

struct Number* H;

printf("\n请输入元素个数n (n>=2):");//输入数据(不得少于2个)

scanf("%d",&n);

while(n<2){

printf("\nError! 请重新输入元素个数n:");

scanf("%d",&n);

}

H=Creat_H(n);

H=Sort(H);

printf("\n排序后的数为:");//数据排序后的序列

while(H!=NULL){

printf("%-4d",H->data);

H=H->next;

}

printf("\n");

system("pause");

return 0;

getchar();

}

五、实验结果与分析

习题1:这题要从前面和后面同时进行处理,只有这样才能保证时间复杂度为O(N)。

六、实验心得及体会

排序有很多种方法,如冒泡排序、直接插入排序、希尔排序、归并排序、选择排序等等。各个排序的方法各有优劣,时间复杂度各不相同。习题二中使用的快速排序方法是冒泡排序的改进方法,时间复杂度比较小。但若初始纪录序列按关键字有序或基本有序时,快速排序退化为冒泡排序。

在实验中学习到很多,每次调试程序都进步不少,以后会多思考,多读程序,使思维更加缜密,调理和清晰,同时也提高自己的提高动手能力。

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

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 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插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

二叉排序树算法

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计课程设计题目:二叉排序树算法 院(系):计算机学院 专业:计算机科学与技术 班级: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 (主函数) 功能:连接各个函数,确定他们的执行顺序和条件。 二叉排 序树算法 主模块 查找模块 插入模块 建立模块 删除模块 先序遍历模块 中序遍历模块

实验三 二叉树的基本操作实现及其应用

二叉树的基本操作实现及其应用 一、实验目的 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<<"二叉树初始化成功!"<>ch; if(ch=='#') BT=NULL; else { if(!(BT=(BitTree)malloc(sizeof(BitNode)))) exit(0);

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

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 ;

二叉树查找

二叉树查找 //树表的查找 #include using namespace std; typedef struct node{ int key; struct node *lchild; struct node *rchild; }bstnode;//二叉树节点 //二叉树的生成 int insert(bstnode *&p,int k) { if(p==NULL)//原来的数时空树 { p=new bstnode; p->key=k; p->lchild=NULL; p->rchild=NULL; return 1; } else if(k==p->key) return 0;//树中存在相同的节点,返回0 else if(kkey) return insert(p->lchild,k); else return insert(p->rchild,k); } //二叉树的创建 bstnode *creat(int *a,int n) { bstnode *p=NULL;//初始化空数 int i=0; while(i

bstnode * search_bst(bstnode *p,int k) { if(p==NULL||p->key==k) return p; if(kkey) return search_bst(p->lchild,k); else return search_bst(p->rchild,k); } bool search(bstnode *p,int k) { bstnode *bt; bt=search_bst(p,k); if(bt==NULL) return 0; else return 1; } //二叉树的删除操作 void delete1(bstnode*p,bstnode*&r)//当被删除的节点p有左右节点的时候的删除{ bstnode *q; if(r->rchild!=NULL) delete1(p,r->rchild);//递归找到最右下节点 else { p->key=r->key;//将r的关键字幅值 q=r; r=r->lchild;//直接将其左子树的根节点放到被删除节点的位置上 delete q; } } void delete_node(bstnode *&p)//删除节点 { bstnode *q; if(p->rchild==NULL)//没有右子树 { q=p; p=p->lchild; delete q; } else if(p->lchild==NULL) { q=p;

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

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

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

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

二叉树的各种算法

二叉树的各种算法.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

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

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

1.设计任务概述:

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

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

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

一、实验题目 给定一系列键值和权重,构造最优二叉排序树,使得总的查找次数最少。 二、实验目的 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

设计一个完整的程序,实现二叉树的各种算法

实验6 实验目的: 1、掌握二叉树的所有算法 2、熟悉计算机英语和术语 实验步骤: 1、二叉树算法的模拟 2、完型填空 3、翻译 具体要求: 一、设计一个完整的程序,实现二叉树的各种算法 要求:/*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 输入: 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 输出: 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 代码: #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 Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) { // 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。 //补全代码,可用多个语句

最优二叉查找树

二叉查找树(BST,Binary Search Tree),又名二叉搜索树或二叉检索树,是一颗满足如下条件的树: 1、每个节点包含一个键值 2、每个节点有最多两个孩子 3、对于任意两个节点x和y,它们满足下述搜索性质: a、如果y在x的左子树里,则key[y] <= key[x] b、如果y在x的右子树里,则key[y] >= key[x] 最优二叉查找树(Optimal BST,Optimal Binary Search Tree) 最优二叉查找树是使查找各节点平均代价最低的二叉查找树。具体来说就是:给定键值序列K = ,k1 < k2 <.. < kn,其中键值ki,被查找的概率为pi,要求以这些键值构建一颗二叉查找树T,使得查找的期望代价最低(查找代价为检查的节点数)。 下面是对于查找期望代价的解释: 对于键值ki, 如果其在构造的二叉查找树里的深度(离开树根的分支数)为depthT(ki),则搜索该键值的代价= depthT(ki) +1(需要加上深度为0的树根节点)。由于每个键值被查找的概率分别为pi,i=1,2,3…,n。所以查找期望代价为: E[T的查找代价] = ∑i=1~n(depthT(ki) +1)*pi 时间复杂度 1、穷举 穷举构造最优二叉查找树,其实就是这样的一个问题: 给一个拥有n个数的已排序的节点,可以将其构造成多少种不同的BST(用来找到一个最优的二叉查找树)? 设可以构造成T(n)个,那么枚举每一个元素作为根节点的情况,当第一个元素作为根节点时,其余n-1个构成右子树,无左子树,是n-1情况时的子问题,共T(n-1)种;当第二个元素作为根节点时,左子树有1个元素,右子树有n-2个元素,根据乘法原理共有T(1)T(n-2)种情况……依此类推得到:T(n)= (0)T(n-1)+T(1)T(n-2)+T(2)T(n-3)+ ......+T(n-2)T(1)+T(n-1)T(0);此外,有T(0)=T(1)=1。 下面来求解T(n): 定义函数f(x) = T(0) + T(1)*x + T(2)*x2 + ...... 那么有: f(x)2 = (T(0)2) + (T(0)T(1) + T(1)T(0)) · x + (T(0)T(2) + T(1)T(1) + T(2)T(0)) · x2 + ......

实现平衡二叉排序树的各种算法代码 一

实现平衡二叉排序树的各种算法代码一 /* 《实现平衡二叉排序树的各种算法》 一、分析题目要求 用函数实现如下平衡二叉排序树算法,: (1)插入新结点 (2)前序、中序、后序遍历二叉树(递归) (3)前序、中序、后序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 (9)删除某结点 为了完成以上的各项操作,首先应该用函数建一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。在遍历二叉树的结点时需要一个访问结点数据的函数。二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还是左右子树都有的情况:若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。 */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define OK 1 #define ERROR 0

二叉树遍历算法的实现

二叉树遍历算法的实现 题目:编制二叉树遍历算法的实现的程序 一.需求分析 1.本演示程序中,二叉树的数据元素定义为非负的整型(unsigned int)数据,输 入-1表示该处没有节点 2.本演示程序输入二叉树数据均是按先序顺序依次输入 3.演示程序以用户和计算机对话方式执行,即在计算机终端上显示“提示信息” 之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运 算结果显示在其后 4.本实验一共包括三个主要程序,分别是:1)二叉树前序,中序,后序遍历递归 算法实现2)二叉树前序中序遍历非递归算法实现3)二叉树层次遍历算法实现 5.本程序执行命令包括:1)构建二叉树2)二叉树前序递归遍历3)二叉树中序 递归遍历4)二叉树后序递归遍历5)二叉树前序非递归遍历6)二叉树中序非 递归遍历7)二叉树层次遍历 6.测试数据 (1)7 8 -1 9 10 -1 -1 -1 6 11 -1 -1 12 13 -1 -1 14 -1 -1 (2)1 -1 -1 (3)7 8 -1 -1 9 -1 -1 二.概要设计 1.为实现二叉树的遍历算法,我们首先给出如下抽象数据类型 1)二叉树的抽象数据类型 ADT BiTree{ 数据对象D:D是具有相同特性的数据元素的集合 数据关系R: 若D=Φ,则R=Φ,称BiTree是空二叉树; 若D≠Φ,则R={H},H是如下二元关系: (1)在D中存在唯一的成为根的数据元素root,它在关系H下无前驱; (2)若D-{H}≠Φ,则存在D-{root}={D1,D r},且D1∩D r=Φ (3)若D1≠Φ,则D1中存在唯一的元素x1,∈H,且存在D1上的 关系H1?H;若Dτ≠Φ,则D r中存在唯一的元素x r,∈ H,且存在D r上的关系H r?H;H={,,H1,H r}; (4)(D1,{H1})是符合本定义的二叉树,成为根的左子树,(D r,{H r})是 一颗符合本定义的二叉树,成为根的右字树。 基本操作P: InitBiTree(&T); 操作结果:构造空二叉树 DestroyBiTree(&T) 初始条件;二叉树存在 操作结果:销毁二叉树 CreateBiTree(&T,definition);

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

实验三二叉排序树的建立和查找 一、实验目的 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.6.20-2011.7.1 指导教师:

2010—2011年度第 2 学期

一、需求分析 1.问题描述: 二叉排序树的实现 用顺序和二叉链表作存储结构 1) 以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; 2) 对二叉排序树T作中序遍历,输出结果; 3) 输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”; 2.基本功能 1) 生成一棵二叉排 2) 对二叉排序树T作中序遍历 3) 查找二叉排序树T 3.输入输出 输入: 输入数列L以回车('\n')为输入结束标志 输出: 中序遍历的二叉树 二、概要设计 1.设计思路: 首先,要创建一棵二叉排序树;必须定义二叉排序树的结点结构数据类型,并定义insert函数,在二叉排序树中插入结点。 要中序遍历二叉排序树,必然用到递归算法。先根再左再右。 要在二叉树中查找输入的元素,若存在含x的结点,则删除该结点,并作中序遍历。2.数据结构设计: void inorder(node *&root) 中序遍历,符合升序输出 void insert(node *&ptr,int item) 在查找树中插入元素 node *find(node *&ptr,int item) 在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。 node *&findy(node *&ptr,int item) 在查找树中查找肯定存在的元素,并返回其引用 void dele(node *&ptr) 删除值为item所在结点 3.软件结构设计 Main模块 二叉排序树模块 三、详细设计 1.树的结点数据类型: class node

二叉排序树

6.5 二叉排序树★3◎4 1.二叉排序树定义 二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值。 (2)左右子树也都是二叉排序树,如图6-2所示。 2.二叉排序树的查找过程 由其定义可见,二叉排序树的查找过程为: (1)若查找树为空,查找失败。 (2)查找树非空,将给定值key与查找树的根结点关键码比较。 (3)若相等,查找成功,结束查找过程,否则: ①当给值key小于根结点关键码,查找将在以左孩子为根的子树上继续进行,转(1)。 ②当给值key大于根结点关键码,查找将在以右孩子为根的子树上继续进行,转(1)。 3.二叉排序树插入操作和构造一棵二叉排序树 向二叉排序树中插入一个结点的过程:设待插入结点的关键码为key,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,该插入结点已存在,不用插入;查找不成功时,则插入之。因此,新插入结点一定是作为叶子结点添加上去的。构造一棵二叉排序树则是逐个插入结点的过程。对于关键码序列为:{63,90,70,55,67,42,98,83,10,45,58},则构造一棵二叉排序树的过程如图6-3所示。 4.二叉排序树删除操作 从二叉排序树中删除一个结点之后,要求其仍能保持二叉排序树的特性。 设待删结点为*p(p为指向待删结点的指针),其双亲结点为*f,删除可以分三种情况,如图6-4所示。

(1)*p结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针,如图6-4(a)所示。 (2)*p结点只有右子树或只有左子树,此时,只需将或替换*f结点的*p子树即可,如图6-4(b)、(c)所示。 (3)*p结点既有左子树又有右子树,可按中序遍历保持有序地进行调整,如图6-4(d)、(e)所示。 设删除*p结点前,中序遍历序列为: ① P为F的左子女时有:…,Pi子树,P,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…。 ②P为F的右子女时有:…,F,Pi子树,P,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,…。 则删除*p结点后,中序遍历序列应为: ①P为F的左子女时有:…,Pi子树,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…。 ② P为F的右子女时有:…,F,Pi子树,Pj,S子树,Pk,Sk子树,…,P2,S2子树,

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

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

基于二叉排序树的商品信息查询算法的设计与实现-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:创建一个二叉树结点,若结点存在则不插入,若不存在则插入,并打印插入后的二叉树

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