二叉排序树的建立、插入、删除和查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:二叉排序树的建立、插入、删除和查找
完成日期:2010-7-
一、需求分析
1、运行环境:VC++6.0;语言:C语言;
程序所实现的功能:给出一组关键值,建立相应的二叉排序树,完成:
1结点的删除操作,插入一个新结点的操作
2对给定的值在二叉排序树进行查找;
3随时显示操作的结果。
2、程序的输入:n个关键字,及要插入,删除,查找的关键字;
3、程序的输出:操作后的二叉排序树的中序序列即递增序列;
4、测试数据:1)8 12 5 10 6 11 13 9 (n=8);10;7;11;
2)10 7 12 9 8 (n=5);10;6;10;
3) 8 5 6 (n=3);6;9;8;
二、概要设计
1、程序的主要流程图:
2、主要模块:
1)主函数模块
Main()
{
建立n个关键字的二叉排序树并输出;
从二叉树排序树T中删除任意结点,其关键字为x;
在二叉树排序树T中,插入一个结点t,其关键字为key1;
在二叉排序树T中递归查找关键字等于 key2 的数据元素;
查找成功则输出SUCCESS;
查找失败则输出NOSUCCESS;
}
2)创建二叉排序树模块
BiTree CreatBST(int n)
{
建立n个关键字的二叉排序树;
从键盘输入调建立n个关键字依次用InsertBST1(插入函数);
返回根结点T;
输出过程;
}
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 的数据元素;
若成功,返回指向该数据元素结点的指针;
否则返回空指针;
}
3、抽象数据类型设计;
对于二叉树排序树而言,每个节点都是由“数据域”、左右“指针域”三部分组成的,因此将二叉树抽象成一个指向根结点由“关键字,左右孩子”构成的二叉链表。
三、详细设计
1、二叉排序树数据类型定义;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
BiTree T;// 二叉树排序树T
2、主要函数说明:(伪代码及算法设计思想)
void main()
{
T=CreatBST(n); //建立n个关键字的二叉排序树,返回根结点T //从二叉树排序树T中删除任意结点,其关键字为x
DeleteNode(T, x);
Inorder(T);
//在二叉树排序树T中,插入一个结点t,其关键字为key1 t=(BiTree)malloc(sizeof(BiTNode));
t->data=key1;
t->lchild=NULL; t->rchild=NULL;
InsertBST1(T,t);
Inorder(T);
//在二叉排序树T中递归查找关键字等于 key2 的数据元素
s=SearchBST1(T,key2);
if(s)printf("SUCESS\n");//查找成功
else printf("NOSUCESS\n");//查找失败
}
BiTree SearchBST1(BiTree T, TElemType key)
{//在根指针T所指二叉排序树中递归查找关键字等于 key 的数据元素
//若成功,返回指向该数据元素结点的指针,否则返回空指针;s为返回//指针
if(T==NULL) return NULL;
if(T->data==key) s=T;
else if(T->data>key) //key大于当前结点的关键字,则查找左子树s=SearchBST1(T->lchild,key);
//key小于当前结点的关键字则查找右子树
Else
s=SearchBST1(T->rchild,key);
return s;
}
void Inorder(BiTree T)
{//中序输出二叉树排序树T(非空时)
if(T!=NULL)
{
Inorder(T->lchild);//中序输出左子树
printf("%3d",T->data);//访问结点
Inorder(T->rchild);//中序输出右子树
}
}
void InsertBST1(BiTree &T,BiTNode *s)
{//在二叉树排序树T中,插入一个结点s的递归算法
t=SearchBST1(T,s->data);
//若s的关键字不在T中出现,则插入
if(!t)
{
if(T==NULL)T=s; //空树时作为根结点
else if(s->data
InsertBST1(T->lchild,s); //将s插入T的左子树
else
InsertBST1(T->rchild,s); //将s插入T的右子树
}
}
BiTree CreatBST(int n)
{//建立n个关键字的二叉排序树,
//从键盘输入调建立n个关键字依次用InsertBST1(插入函数),
//返回根结点T
T=NULL;
printf("建树过程:\n");
for(i=1;i<=n;i++)
{
printf("插入结点关键值:\n");
scanf(key);
s=(BiTree)malloc(sizeof(BiTNode));//开辟存储单元,并对结点赋值s->data=key;
s->lchild=NULL; s->rchild=NULL;
InsertBST1(T,s); //调用插入算法
Inorder(T);//中序输出
}
return T;
}
DeleteNode(BiTree &T, int x)
{//从二叉树排序树T中删除任意结点,其关键字为x
p=T; //从根结点开始查找