6.3二叉排序树
定义:二叉排序树(Binary Search Tree也叫二叉搜索树)或者是空树或者是具有以下性质的二叉树;(左小右大)
1)若左子树不空,则左子树上的所有结点的值均小于它的根结点的值。
2)若右子树不空,则右子树上的所有结点的值均大于它的根结点的值。
3)它的左右子树也是一颗二叉排序树。
对二叉排序树进行中序遍历可以得到一个递增的有序序列。
二叉排序树的目的,不是为了排序,而是为了提高查找和插入关键字的速度(有序,树型结构)
1查找关键字代码:
//递归代码
BiTNode *BFS_Search(BiTNode *t,ElemType key){
if(t==NULL)
return NULL; //树为空返回空值
else{
if(t->key==key)
return t;
else if(key<t->key)
return BFS_Search(t->lchild,key);
else
return BFS_Search(t->rchild,key);
}
}
//非递归代码
BiTNode *BFS_Search(BiTNode *t,ElemType key){
BiTNode *p=t;
while(p!=NULL&&Key!=p->data){//p不为空且没找到key
if(key<p->data)
p=p->lchild;
else
p=p->rchild;
}
return p;
}
2.二叉排序树插入关键字代码:
1)空树:直接插入新结点返回成功。
2)树不空:检查是否存在关键字重复的结点;
@存在;返回插入失败
@不存在:检查根结点的值和待插入关键字的大小关系递归插入左右子树。
int BFS_Insert(BiTNode*&t,ElemType k){ //插入操作是对树进行修改,所以用引用类型的指针
if(t ==NULL){
t=(BiTNode*)malloc(sizeof(BiTNode));
t->key=k;
t->lchild=t->rchild=NULL;
return 1;
}
else if(k==t->key)
return 0
else if(k<t->key)
return BFS_Insert(t->lchild,k);
if(k>t->key)
return BFS_Insert(t->rchild,k);
}
3.二叉排序树构造代码:
构造二叉排序树的过程可以理解成从一棵空树开始,依次插入二叉排序树的 结点
void Creat_BFS(BiTNode *&t,ElemType key[],int n){
//t是二叉排序树的根结点指针,key是关键字数组,n是关键字数目
t=NULL; //初始化t为空树
int i=0;
while(i<n){
BFS_Insert(t,key[i]);
i++;
}
}
4.二叉排序树删除结点
1)删除的是叶子结点
2)删除的仅有左子树或者右子树的结点
3)删除的是左右子树都得结点
错误的:
正确的:
前驱结点:左孩子中关键字最大的结点
后继结点:有孩子中关键字最小的结点
二叉排序树的性能分析:
最好的情况就是向左上图这种完全二叉树,这种情况下查找的时间复杂度为O(logn)。