1. 概念
简称BST,也称二叉查找树。其具备下列特性:
1). 若左子树非空,则左子树上所有关键字值均小于根结点的关键字值
2). 若右子树非空,则右子树上所有关键字值均大于根结点的关键字值
3). 左,右子树本身也分别是一颗二叉排序树
十分方便得出,使用中序遍历,得到的将是有序序列。
2.二叉排序树的插入
int BST_Insert(BiTree &T, KeyType k){
//在二叉排序树T中插入一个关键字为k的结点
if(T==NULL){ //原树为空,新插入的记录为根结点
T = (BiTree)malloc(sizeof(BSTNode));
T->key = k;
T->lchild = T->rchild = NULL;
return 1; //返回1,插入成功
}
else if(k==T->key) //树中存在相同关键字的结点
return 0;
else if(k<T->key) //插入到T的左子树中
return BST_Insert(T->lchild,k);
else //插入到T的右子树中
return BST_Insert(T->rchild,k);
}
手动模拟一下,就可以知道插入的新结点一定是某个叶结点。
3. 二叉排序树的构造
二叉树的构造,实质就是多重插入。依次输入数据元素,并将它们插入到二叉排序树中的适当位置上。
void Creat_BST(BiTree &T, KeyType str[], int n){
//用关键字数组str[]建立一个二叉排序树
T = NULL; //初始时bt为空树
int i=0;
while(i<n){ //依次将每个元素插入
BST_Insert(T, str[i]);
i++;
}
}
4. 二叉排序树的查找
树的递归显然很容易,但递归使用到的递归栈会让程序执行效率极低,可以不使用基本的递归方式。
BSTNode *BST_Search(BiTree T, ElemType key, BSTNode *&p){
//查找函数返回指向关键字值为key的结点指针,若不存在,返回NULL
p = NULL;
while(T!=NULL&&key!=T->data){
p=T;
if(key<T->data) T=T->lchild;
else T = T->rchild;
}
return T;
}
5. 二叉排序树的删除
这个在几个操作中是最难的,有下列几个难点:
1). 删除一个节点是,不能把该结点为根的子树上的结点都删除。删除该结点而断开的二叉链表需要重新链接起来。
2). 链接起来之后,还需要保证二叉排序树的性质不会丢失。
a. 如果删除结点是叶结点,则直接删除,不会破坏二叉排序树的性质。
b. 若结点z只有一颗左子树或右子树,则令z的子树取代z, 成为z父结点的子树。
c. 若z存在左,右子树。则用左子树中序的最后一个子女填充或右子树中序的第一个子女填充。
6. 二叉排序树的查找效率的分析
其查找的效率主要取决与树的高度H,即与二叉树的形态有关,O(H)。