二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有如下性质的二叉树:1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值 2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值 3)它的左右子树也分别为二叉排序树。
二叉排序树的查找
int SearchBST(BiTree T,KeyType key, BiTree f,BiTree &p) { //在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功, //则指针p指向该数据元素节点,并返回true,否则指针p指向查找路径上访问的 //最后一个节点并返回false,指针f指向T的双亲,其初始调用值为NULL if(!T) {p=f;return false;} else if(key==T->data.key) {p=T; return true;} else if(key<T->data.key) return SearchBST(T->lchild,key,T,p); else return SearchBST(T->rchild,key,T,p); }
二叉排序树的插入
int InsertBST(BiTree &T,ElemType e) { //当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回true,否则,返回false if(!SearchBST(T,e,NULL,p) { s = (BiTree)malloc(sizeof(BiTNode)); s->data= e; s->lchild=s->rchild=NULL; if(!p) T=s; else if(e.key<p->data.key) p->lchild=s; else p->rchild=s; return true; } else return false; }
二叉排序树的删除
int DeleteBST(BiTree &T, KeyType key) { //若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素节点 //并返回true,否则,返回false if(!T) return false; else { if(key==T->data.key) return Delete(T); else if(key<T->data.key) return DeleteBST(T->lchild,key); else return DeleteBST(T->rchild,key); } }
int Delete(BiTree &p) { //从二叉排序树中删除节点p,并重接它的左或右子树 if(!p->lchild) {q=p;p=p->rchild;free(q);} else if(!p->rchild) {q=p;p=p-lchild;free(q);} else //左右子树均不空 { q=p;s=p->lchild; while(p->rchild) { q=s; s=s->rchild; } p->data= s->data; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; free(s); } return true; }
为什么会有平衡二叉树呢?
二叉排序树的查找性能:最好的情况是,二叉排序树的形态和折半查找的判定树相同,其平均查找长度和lgn成正比;最坏的情况下,二叉排序树为单支树(因为序列本来就有序),这时平均查找长度为(n+1)/2。 在随机情况下,二叉排序树的平均查找长度和lgn是等数量级的。
为了避免最坏情况的出现,对二叉树进行平衡化处理,这就是为什么会出现平衡二叉树。