二叉排序树概念
二叉排序树是动态查找表的一种,也是常用的表示方法。
其中,它具有如下性质:
1.若它的左子树非空,则其左子树的所有节点的关键值都小于根节点的关键值。
2.若它的右子树非空,则其右子树的所有节点的关键值都大于根结点的关键值。
3.它的左右子树也分别都是二叉排序树。
PS:对二叉排序树进行中序遍历,得到的序列,总会是一个升序的数列。
二叉排序树的建立
我们使用C语言来建立。
其中我们对二叉排序树的结构体定义如下:
cpp
typedef int ElemType;
typedef struct BTNode{
ElemType key;
struct BTNode *lchild,*rchild;
}BTNode,*BSTree;
建立二叉排序树的代码如下:
cpp
BSTree InsertBST(BSTree bst,BSTree s) //遍历二叉排序树,找到合适的位置
{
if(bst==NULL)
bst = s;
else{
if(s->key < bst->key)
bst->lchild = InsertBST(bst->lchild,s);
if(s->key > bst->key){
bst->rchild = InsertBST(bst->rchild,s);
}
}
return bst;
}
BSTree CreateBST() //建立二叉排序树
{
BSTree bst,s;
int key;
bst = NULL;
printf("请输入关键字值,输入-1结束.\n");
while(1){
scanf("%d",&key);
if(key!=-1){
s = (BSTree)malloc(sizeof(BTNode));
s->key = key;
s->lchild = NULL;
s->rchild = NULL;
bst = InsertBST(bst,s);
printf("成功.\n");
}
else
break;
}
return bst;
}
二叉排序树的插入
cpp
BSTree InsertBST(BSTree bst,BSTree s) //遍历二叉排序树,找到合适的位置
{
if(bst==NULL)
bst = s;
else{
if(s->key < bst->key)
bst->lchild = InsertBST(bst->lchild,s);
if(s->key > bst->key){
bst->rchild = InsertBST(bst->rchild,s);
}
}
return bst;
}
BSTree SearchBST(BSTree bst,int key) //查找关键值key的节点,并且返回这个节点
{
if(bst == NULL)
return NULL;
else if(key == bst->key)
return bst;
else if(key > bst->key)
return SearchBST(bst->rchild,key);
else
return SearchBST(bst->lchild,key);
}
BSTree InsertBST_key(BSTree bst,int key) //搜寻一个关键值,如果没有就插入
{
BSTree s;
s = SearchBST(bst,key);
if(s)
printf("该节点已经存在.");
else{
s = (BSTree)malloc(sizeof(BTNode));
s->key = key;
s->lchild = NULL;
s->rchild = NULL;
s = InsertBST(bst,s);
}
return s;
}
查找二叉排序树指定节点的双亲
cpp
BSTree SearchBST_F(BSTree bst,int key,BSTree *F) //F存储key关键值节点的双亲节点,函数返回key关键值节点.
{
if(bst == NULL)
return NULL;
if(key == bst->key)
return bst;
else{
*F = bst;
if(key < bst->key)
return SearchBST_F(bst->lchild,key,F);
else
return SearchBST_F(bst->rchild,key,F);
}
}