二叉排序树的定义:
(1)、如果左子树不为空,则左子树上所有关键字的值均小于根关键字的值;
(2)、如果右子树不为空,则右子树上所有关键字的值均大于根关键字的值;
(3)、左右子树又各是一棵二叉排序树。
一、查找
思想:查找的关键字要么在左子树,要么在右子树,要么在根结点上。根据二叉排序树的定义可知,根结点把所有关键字分为两部分,即大于它的在右子树,小于的在左子树。由此,可以先将要查找的关键字与根结点相比较,如果相等,则查找成功;如果大于,则到右子树里查找,此时不必考虑左子树;如果小于,则到左子树里查找,此时不必考虑右子树,以此类推。
//二叉排序树的查找
BTNode *BSTSearch(BTNode *bt,int key)
{
if(bt == NULL)
{
return NULL;
}
else
{
if(bt->data == key)
{
return bt;
}
else if(key > bt->data)
{
return BSTSearch(bt->rchild,key);
}
else
{
return BSTSearch(bt->lchild,key);
}
}
}
二、插入
需要考虑要插入的元素是否已经存在于这个二叉树中。如果已经存在,则插入失败。如果不存在,对于不存在二叉排序树的关键字的插入,其查找不成功的位置就是关键字的插入位置。可以参考查找算法。
注意对于判空的处理
//二叉排序树的插入
int BSTInsert(BTNode *&bt,int key)
{
if(bt == NULL)
{
bt = (BTNode*)malloc(sizeof(BTNode));
bt->data = key;
bt->lchild = bt->rchild = NULL;
return 1;
}
else
{
if(key == bt->data) //已经存在
{
return 0;
}
else if(key > bt->data)
{
BSTInsert(bt->rchild,key);
}
else
{
BSTInsert(bt->lchild,key);
}
}
}
三、构造二叉排序树
只需建立一棵空树,然后逐个元素插入到空树中即可。
void CreatBST(BTNode *&bt,int key[],int n)
{
bt = NULL;
for(int i = 0;i < n;i++)
{
BSTInsert(bt,key[i]);
}
}
四、删除关键字( p结点为要删除结点)
分类讨论:
(1)、p结点为叶子结点,直接删除即可。
(2)、p结点只有左子树没有右子树,或者只有右子树没有左子树。此时,只需把p结点删除,然后把它的左子树或者右子树放到原来它的位置上即可。
(3)、p结点既有左子树,又有右子树。此时可以转化成(1)或者(2)的情况,做法:先沿p的左子树右指针一直往右走,直到来到其右子树的最右边的一个结点r,然后p的关键字用r替换。最后判断是(1)还是(2)。(PS: 用被删结点左子树最右下的结点的值代替被删结点的值,然后删去最右下的结点 用被删结点右子树最左下的结点的值代替被删结点的值,然后删去最左下的结点)