一、定义
二叉排序树(Binary Sort Tree)或是一棵空树,或满足下列性质的一棵非空的二叉树T:
- 如果T的左子树非空,则左子树所有结点值小于T的根值;
- 如果T的右子树非空,则右子树所有结点值大于T的根值;
- T的左子树和右子树均为二叉排序树。
二、查找关键字
(1)算法思想
(2)实现
typeof struct BTNode
{
int key;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
BTNode * BSTsearch(BTNode *bt,int key)
{
if(bt==NULL)
return NULL;
else
{
if(bt->key==key)
return bt; // 等于根结点中的关键字,查找成功,返回关键字所在的结点指针
else if(key<bt->key)
return BSTsearch(bt->lchild,key);
else
return BSTsearch(bt->rchild,key);
}
}
三、插入关键字
(1)算法思想
(2)实现
typeof struct BTNode
{
int key;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
int BSTinsert(BTNode *&bt,int key) // 因为指针bt要改变,所以要用引用型指针
{
if(bt==NULL)
{
bt=(BTNode*)malloc(sizeof(BTNode)); // 创建新结点
bt->lchild=bt->lchild=NULL;
bt->key=key;
return 1; // 插入成功,返回1
}
else
{
if(bt->key==key)
return -1; // 等于根结点中的关键字,插入失败,返回-1
else if(key<bt->key)
return BSTsearch(bt->lchild,key);
else
return BSTsearch(bt->rchild,key);
}
}
四、二叉排序树的创建
(1)算法思想
(2)实现
void CreateBST(BTNode *&bt,int key[],int n)
{
int i;
bt=NULL; // 将树清空
for(i=0;i<n;i++)
BSTinsert(bt,key[i]);
}
五、删除关键字的操作
(1)算法思想
当在二叉排序树中删除一个关键字时,不能把以该关键字所在的结点为根的子树都删除,而是只删除这一个结点,并保持二叉排序树的特性。删除结点p的过程分为以下3种情况
1. p结点为叶子结点(若p结点为21)
- 直接删除即可
2. p结点只有右子树而无左子树 ,或者只有左子树而无右子树。(若p结点为56)
- 此时只需要将p删掉,然后将p的子树直接连接在原来p与其双亲结点f相连的指针上即可。
3. p结点既有左子树又有右子树。 (若p结点64,此时r结点为56)
- 沿着p的左子树根结点的右指针一直往右走,直到来到右子树的最右边的一个结点
- 然后将p中的关键字用r中的关键字代替。
- 最后判断,如果r是叶子结点,则按照(1)中的方法删除r;如果r是非叶子结点,则按照(2)中的方法删除r。