二叉排序树插入与删除元素
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(key
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)
{