二叉排序树的建立、插入、删除和查找

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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->datadata)

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; //从根结点开始查找

相关文档
最新文档