二叉排序树插入与删除元素

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告

知识范畴:查找

实验题目:二叉排序树插入与删除元素

实验内容及要求:

编写控制台应用程序,提供以下菜单项:

1.插入元素

从键盘输入若干两两互不相同的非0整数,直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。

插入某个非0整数时,若该整数已在二叉排序树中,则插入该整数失败(应显示提示信息)。

全部整数插入结束后,显示成功插入的整数个数。

2.删除元素

输入一个整数,若它在二叉排序树中,则删除它(提示删除成功与失败)。

3.输出

输出二叉排序树的先序和中序递归遍历结点访问次序。

4.结束程序

实验目的:掌握二叉排序树插入、删除元素的基本算法。

数据结构设计简要描述:

采用单向二叉链表存储二叉排序树,结点采用结构体存储,该结构体包含两个整型数据域,两个结构体本身类型的指针域,结构如下:

typedef struct node

{

KeyTp K; //关键字

ElemTp data; //数据域

struct node *lchild, *rchild; //左、右儿子指针

}BSTNode, *BST;

算法设计简要描述:

插入结点算法:

插入结点时,先将待插入的结点与当前结点比较大小,若关键字大于当前结点则遍历指针指向当前结点的右儿子,再与右儿子比较大小;若关键字小于当前结点,遍历指针指向当前结点的左儿子。

循环执行该步骤,直至遍历指针指向的地址为空。则查找到了合适的位置,记录父母指针,若待插入的结点关键字大于父母指针,则带插入结点作为右儿子,否则为左儿子。

树为空时直接作为根结点。

删除结点算法:

已知bt为根结点地址,p为待删除的结点,f为待删除的结点的父母指针。Pl指向p 的左儿子,pr指向右儿子,s指向pl。

删除p,若pl不为空,pr为空,s指向pl;若pl为空,pr不为空,s指向pr。

若pr和pl都不为空,查找pl为根结点的最后一个右儿子(ps=s;s=s->rchild;)。

ps为s的双亲结点。孤立s结点,若ps为空,则pl指向s的左儿子;否则ps的右儿子指向s的左儿子。

找到pl,pr作为s的左右儿子。

若p为f的左儿子,则f的左儿子指向s;若p为f的右儿子,则f的右儿子指向s。输入/输出设计简要描述:

插入元素时需输入插入的元素的关键字,以空格分隔,输入0时结束输入。

删除元素时输入删除元素的关键字。

执行输出时输出二叉排序树的先序遍历和中序遍历。

输入输出均与提示信息。

编程语言说明:

使用Visual C++编程。主要代码采用C语言实现;动态存储分配采用C++的new和delete操作符实现;输入与输出采用C++的cin和cout流;程序注释采用C/C++规范。

主要函数说明:

BST search(BST bt, KeyTp key) //递归查找算法

int insert(BST &bt, BST p) //二叉排序树插入结点算法

void CrtBst(BST &bt) //二叉排序树的建立方法,从空树开始,反复插入新结点

void delNode(BST &bt, KeyTp key) //删除结点

void preorder(BST bt) //先序遍历

void midorder(BST bt) //中序遍历

程序测试简要报告:

插入元素:4 5 1 3 2 1 1 2 1

输出:

删除元素:1

输出:

插入元素:1

源程序代码:

#include

#include

#include

#include

//#include

using namespace std;

typedef int KeyTp;

typedef int ElemTp;

typedef struct node

{

KeyTp K; //关键字

ElemTp data; //数据域

struct node *lchild, *rchild; //左、右儿子指针}BSTNode, *BST;

//递归算法

BST search(BST bt, KeyTp key)

if(bt==NULL||bt->K==key)

return bt;

if(keyK)

return search(bt->lchild, key);

return search(bt->rchild, key);

}

//二叉排序树插入结点算法

int insert(BST &bt, BST p)

{

BST parent,pt;

parent=NULL;

pt=bt;

while(pt)

{

parent=pt;

if(p->K < pt->K)

pt=pt->lchild;

else if(p->K > pt->K)

pt=pt->rchild;

else

return 0;

}

if(parent)

{

if(p->K < parent->K)

parent->lchild=p;

else

parent->rchild=p;

}

else

bt=p; //空树插入第一个结点*p

return 1;

}

//二叉排序树的建立方法

void CrtBst(BST &bt) //从空树开始,反复插入新结点{

BST p;

KeyTp Ki;

cin>>Ki;

int i = 0;

while(Ki!=0)

{

相关文档
最新文档