当前位置:
文档之家› 二叉排序树的创建、删除、插入等操作
二叉排序树的创建、删除、插入等操作
子树
parent=p;
//由于用覆盖法删根,则不必特殊考虑删根
p=p->right;
while(p->left)
{
parent=p;
p=p->left;
}
tmp->key=p->key;
if(p==parent->left)
parent->left=NULL;
else
parent->right=NULL;
KeyType key;
//存放节点的内容
} BSTNode, * BSTree; //声明二叉树的链表
BSTree insertBST(BSTree tptr,KeyType key)// 在二叉排序树中插入结点
{
//若二叉排序树 tptr 中没有关键字为 key 的结
点,则插入,否则直接返回
BSTree f,p=tptr; //p 的初值指向根结点 while(p) //查找插入位置,循环结束时,p 是空指针,f 指向待插入结点的双亲
**"<<endl;
cout<<"\t\t**
Q...... 结 束 对 这 棵 二 叉 树 的 操 作
**"<<endl;
cout<<"\t\t**
**"<<endl;
cout<<"\t\t***********************************************************"<<endl;
typedef struct BiTNode { // 结点结构
struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
// 左右孩子指针
二叉排序树插入算法伪代码如下:
1. 若 root 是空树,则将结点 s 作为根结点插入;否则 2. 若 s->data<root->data,则把结点 s 插入到 root 的左子树中;否则 3. 把结点 s 插入到 root 的右子树中。
武汉工程大学
计算机科学与工程学院
《数据结构》实验报告
专业班级 学生学号 学生姓名
09 计算机工程 01 0905080116 沈亮
实验地点 指导教师 实验时间
419 蔡琼
实验项目 实验类别
实
验
求
目 的
及
要
查找技术综合应用 操作性()验证性( )设计性( )综合性(Y )其它( )
(1)熟练掌握查找的常用算法; (2)熟练设计和应用查找算法解决比较简单的实际问题。
二叉排序树中删除一个结点 f 的左孩子结点 p 算法伪代码如下:
1. 若结点 p 是叶子,则直接删除结点 p; 2. 若结点 p 只有左子树,则只需重接 p 的左子树;
若结点 p 只有右子树,则只需重接 p 的右子树; 3. 若结点 p 的左右子树均不空,则
3.1 查找结点 p 的右子树上的最左下结点 s 以及结点 s 的双亲结点 par; 3.2 将结点 s 数据域替换到被删结点 p 的数据域; 3.3 若结点 p 的右孩子无左子树,则将 s 的右子树接到 par 的右子树上;
else if(tmp==parent->left)
parent->left=p;
else
parent->right=p;
free(tmp);
}
else if(!p->left) //的左子树为空,则重接 p 的左子树
{
p=p->right;
if(!parent) //要删根,须修改根指针
tptr=p;
break; parent=p; p=(key<p->key)?p->left:p->right; } if(!p) return NULL; tmp=p; if(!p->right&&!p->left) /*p 的左右子树都为空*/ { if(!parent) //要删根,须修改根指针
tptr=NULL; else if(p==parent->right)
BSTree p=root; if(p!=NULL){
inorder_btree(p->left ); cout<<" "<<p->key<<" "; inorder_btree(p->right ); } } int searchBST(BSTree t,KeyType key)//查找 { if(key==t->key) return 1; if(t==NULL) return 0; if(key<t->key) return searchBST(t->left,key); else return searchBST(t->right,key); } BSTree deleteBST(BSTree tptr,KeyType key)//删除 { BSTree p,tmp,parent=NULL; p=tptr; while(p) { if(p->key==key)
{ 建立 n 个关键字的二叉排序树; 从键盘输入调建立 n 个关键字依次用 InsertBST1(插入函数); 返回根结点 T;
数据结构上机实验
3
计算机科学与工程学院
输出过程; } 3)删除模块
DeleteNode(BiTree &T, int x) {
从二叉树排序树 T 中删除任意结点,其关键字为 x; 可以实现删除根结点、叶子结点以及其它任意结点的功能; } 4)插入模块 void InsertBST1(BiTree &T,BiTNode *s) { 在二叉树排序树 T 中,插入一个结点 s(递归算法); 被 CreatBST 函数调用; } 5)查找模块 BiTree searchBST1(BiTree T,TElemType key) { 在根指针 T 所指二叉排序树中递归查找关键字等于 key 的数据元素; 若成功,返回指向该数据元素结点的指针; 否则返回空指针; }
else if(tmp==parent->left)
parent->left=p;
else
parent->right=p;
free(tmp);
}
else if(p->right&&p->left) //p 有左子树和右子树,用 p 的后继覆盖 p 然后删去后继
{
//另有方法:用 p 的前驱覆盖 p 然后删去前驱||合并 p 的左右
类别 上机表现 报告质量 说明:
成绩评定表
评分标准
积极出勤、遵守纪律 认真完成实验任务 程序代码规范、功能正确 填写内容完整、体现收获
分值 30 分 70 分
得分
合计
评阅教师:
日 期:
年
月
日
计算机科学与工程学院
实验内容:二叉排序树。
任意给定一组数据,设计一个算法,建立一棵二叉排序树,对它进行查找、 插入、删除等操作。 实验说明: 二叉排序树存储结构如下:
do
{
flag=0;
cout<<"\n\n 中序遍历二叉树:"<<endl;
inorder_btree(root);
cout<<"\n"<<endl;
cout<<"\t\t************ 请 选 择 你 要 对 这 棵 二 叉 树 所 做 的 操
作:**************"<<endl;
free(p);
}
return tptr;
}
int main()
{
KeyType key;
int flag,test;
数据结构上机实验
7
计算机科学与工程学院
char cmd;
BSTree root;
do
{
cout<<"\n\n"<<endl;
cout<<"\t\t*******请选择你要执行的操作:********"<<endl;
是
否 结束
主要模块: 1)主函数模块 Main() { 建立 n 个关键字的二叉排序树并输出; 从二叉树排序树 T 中删除任意结点,其关键字为 key; 在二叉树排序树 T 中,插入一个结点 t,其关键字为 key; 在二叉排序树 T 中递归查找关键字等于 key2 的数据元素; } 2)创建二叉排序树模块 BiTree CreatBST(int n)
fflush(stdin);
cin>>cmd;
flag++;
}while(cmd!='c'&&cmd!='C'&&cmd!='a'&&cmd!='A');
if(cmd=='c'||cmd=='C')
{
cout<<"请输入你所要创建的二叉树的结点的值,以-1 结束:\n";
root=createBST();
parent->right=NULL; else
parent->left=NULL; free(p); }
数据结构上机实验
6
计算机科学与工程学院
else if(!p->right) //p 的右子树为空,则重接 p 的左子树