首先先理解二叉排序树的定义。二叉排序树满足以下三个性质:
1,若它的左子树不为空,则其左子树上的所有关键字的值均小于根关键字上的值。
2,若它的右子树不为空,则右子树上所有关键字的值均大于根关键字上的值。
3,左右子树又是一颗二叉排序树。
二叉排序树通常用二叉链表来存储的。
typedef 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;//找到了key值,则返回其节点的位置
}
else {
if(bt->key>key)//如果大于key值,则去其左子树上查找
return BSTSearch(bt->lchild,key);
else
return BSTSearch(bt->rchild,key); //反之去右子树上查找。
}
}
}
对于插入的操作,也是基于查找操作进行的:
int BSTNodeInsert(BTNode * &bt,int key){//注意这里应是传引用,因为是插入操作,当插入成功时,原先空节点要进行赋值。如果不是传引用,那么当 调用的函数结束后,bt进行销毁,相当于没插
if(bt==NULL){
bt->key=key;
bt->lchild=NULL;
bt->rchild=NULL;
return 1;//插入成功返回1
}
else{
if(bt->key==key){
return 0;//已存在,则插入失败
}
else{
if(bt->key>key){
return BSTNodeInsert(bt->lchild,key);
}
else{
return BSTNodeInsert(bt->rchild,key);
}
}
}
}
建立一个二叉排序树,建立一个二叉排序树,相当于从一个空节点开始插入。话不多说,上代码:
void BSTNodeBuild(BTNode *& bt,int key[],int n){
bt=NULL;
for(int i=0;i<n;i++){
bt->key=key[i];//先创立待插的节点
BTNodeInsert(bt,key[i]);//调用插入节点 的操作。
}
}