对于一棵有n个节点的完全二叉搜索树的 基本操作可以实现在O(lgn)的时间内,通常一棵随机建立的二叉搜索树的期望也可以达到O(lgn)。对二叉搜索树来说更有意义的数据是它的高度h,因为以下的操作时间复杂度可以描述为O(h)
这里实现的基本操作有:Search(查找节点), Minimum(最小值), Maximum(最大值), Predecessor(前驱), Successor(后继), Insert(插入节点), Delete(删除节点)。
他们可以比较高效地实现一个动态集合(dynamic-set)。
根据二叉搜索树的定义理解这些基本操作的算法并不难。
//
二叉搜索树基本操作演示 by DaNmarner 2006 7
#include < stdio.h >
typedef struct BTType
... {
struct BTType *lch,*rch,*p;
int data;
} BTNODE;
typedef BTNODE * BITREE;
BITREE BST_Maximum(BITREE x);
BITREE BST_Search (BITREE x, int a);
BITREE BST_Minimum(BITREE x);
BITREE BST_Successor(BITREE x);
BITREE BST_Predecessor(BITREE x);
void BST_Insert(BITREE * x,BITREE t);
void BST_Delete(BITREE y);
void InorderTreeWalk (BITREE t);
BITREE Creat( int d);
int main ( void )
... {
BITREE root=NULL;
printf("Displaying Binary Search Tree Operations by DaNmarner 2006 ");
BST_Insert(&root,Creat(343));
BST_Insert(&root,Creat(3423));
BST_Insert(&root,Creat(34233));
BST_Insert(&root,Creat(34));
BST_Insert(&root,Creat(3));
printf("Inorder Tree Walk [ ");
InorderTreeWalk(root);
printf("] ");
printf("The prodecessor of data 343 is: %d ",
BST_Predecessor(BST_Search(root,343))->data);
printf("The successor of data 343 is: %d ",
BST_Successor(BST_Search(root,343))->data);
printf("Maximum of the binary search tree is: %d ",
BST_Maximum(root)->data);
printf("Minimum of the binary search tree is: %d ",
BST_Minimum(root)->data);
BST_Delete(BST_Search(root,343));
printf("Inorder Tree Walk after deleting data 343:[ ");
InorderTreeWalk(root);
printf("] ");
system("pause");
return 0;
}
void InorderTreeWalk (BITREE t) // 中序遍历二叉树
... {
if (t!=NULL) ...{
InorderTreeWalk(t->lch);
printf("%d ",t->data);
InorderTreeWalk(t->rch);
}
}
BITREE BST_Search (BITREE x, int a) // 搜索数据为a的节点
... {
while (x!=NULL && x->data!=a) x=(a<x->data)?x->lch:x->rch;
return x;
}
BITREE BST_Maximum(BITREE x) // 求最大值所在节点
... {
while (x->rch!=NULL) x=x->rch;
return x;
}
BITREE BST_Minimum(BITREE x) // 求最小值所在节点
... {
while (x->lch!=NULL) x=x->lch;
return x;
}
BITREE BST_Successor(BITREE x) // 求节点x的后继
... {
if (x->rch != NULL) return BST_Minimum(x->rch);
else ...{
BITREE y=x->p;
while (y!=NULL && x==y->rch)...{
x=y;
y=y->p;
}
return y;
}
}
BITREE BST_Predecessor(BITREE x) // 求节点x的前驱
... {
if (x->lch != NULL) return BST_Maximum(x->lch);
else ...{
BITREE y=x->p;
while (y!=NULL && x==y->lch)...{
x=y;
y=y->p;
}
return y;
}
}
void BST_Insert(BITREE * x,BITREE t) // 在二叉树x中插入节点t
... {
BITREE y=NULL,p=*x;
while (p!=NULL)
...{
y=p;
p=(t->data<p->data)?p->lch:p->rch;
}
if(y==NULL) *x=t;
else ...{
if (t->data<y->data) y->lch=t;
else y->rch=t;
t->p=y;
}
}
void BST_Delete(BITREE y) // 删除节点y
... {
if (y->lch==NULL && y->rch==NULL && y->p) ...{
if(y==(y->p)->lch) (y->p)->lch=NULL;
else (y->p)->rch=NULL;
}else if (y->rch==NULL && y->p) ...{
if(y==y->p->lch) y->p->lch=y->lch;
else y->p->rch=y->lch;
}else if (y->lch==NULL && y->p) ...{
if(y==y->p->lch) y->p->lch=y->rch;
else y->p->rch=y->rch;
}else ...{
BITREE t=BST_Successor(y);
y->data=t->data;
BST_Delete(t);
y=t;
}
free(y);
}
BITREE Creat( int d) // 建立节点
... {
BITREE tmp = (BITREE)malloc(sizeof(BTNODE));
tmp->data = d;
tmp->p=tmp->lch=tmp->rch = NULL;
return tmp;
}
#include < stdio.h >
typedef struct BTType
... {
struct BTType *lch,*rch,*p;
int data;
} BTNODE;
typedef BTNODE * BITREE;
BITREE BST_Maximum(BITREE x);
BITREE BST_Search (BITREE x, int a);
BITREE BST_Minimum(BITREE x);
BITREE BST_Successor(BITREE x);
BITREE BST_Predecessor(BITREE x);
void BST_Insert(BITREE * x,BITREE t);
void BST_Delete(BITREE y);
void InorderTreeWalk (BITREE t);
BITREE Creat( int d);
int main ( void )
... {
BITREE root=NULL;
printf("Displaying Binary Search Tree Operations by DaNmarner 2006 ");
BST_Insert(&root,Creat(343));
BST_Insert(&root,Creat(3423));
BST_Insert(&root,Creat(34233));
BST_Insert(&root,Creat(34));
BST_Insert(&root,Creat(3));
printf("Inorder Tree Walk [ ");
InorderTreeWalk(root);
printf("] ");
printf("The prodecessor of data 343 is: %d ",
BST_Predecessor(BST_Search(root,343))->data);
printf("The successor of data 343 is: %d ",
BST_Successor(BST_Search(root,343))->data);
printf("Maximum of the binary search tree is: %d ",
BST_Maximum(root)->data);
printf("Minimum of the binary search tree is: %d ",
BST_Minimum(root)->data);
BST_Delete(BST_Search(root,343));
printf("Inorder Tree Walk after deleting data 343:[ ");
InorderTreeWalk(root);
printf("] ");
system("pause");
return 0;
}
void InorderTreeWalk (BITREE t) // 中序遍历二叉树
... {
if (t!=NULL) ...{
InorderTreeWalk(t->lch);
printf("%d ",t->data);
InorderTreeWalk(t->rch);
}
}
BITREE BST_Search (BITREE x, int a) // 搜索数据为a的节点
... {
while (x!=NULL && x->data!=a) x=(a<x->data)?x->lch:x->rch;
return x;
}
BITREE BST_Maximum(BITREE x) // 求最大值所在节点
... {
while (x->rch!=NULL) x=x->rch;
return x;
}
BITREE BST_Minimum(BITREE x) // 求最小值所在节点
... {
while (x->lch!=NULL) x=x->lch;
return x;
}
BITREE BST_Successor(BITREE x) // 求节点x的后继
... {
if (x->rch != NULL) return BST_Minimum(x->rch);
else ...{
BITREE y=x->p;
while (y!=NULL && x==y->rch)...{
x=y;
y=y->p;
}
return y;
}
}
BITREE BST_Predecessor(BITREE x) // 求节点x的前驱
... {
if (x->lch != NULL) return BST_Maximum(x->lch);
else ...{
BITREE y=x->p;
while (y!=NULL && x==y->lch)...{
x=y;
y=y->p;
}
return y;
}
}
void BST_Insert(BITREE * x,BITREE t) // 在二叉树x中插入节点t
... {
BITREE y=NULL,p=*x;
while (p!=NULL)
...{
y=p;
p=(t->data<p->data)?p->lch:p->rch;
}
if(y==NULL) *x=t;
else ...{
if (t->data<y->data) y->lch=t;
else y->rch=t;
t->p=y;
}
}
void BST_Delete(BITREE y) // 删除节点y
... {
if (y->lch==NULL && y->rch==NULL && y->p) ...{
if(y==(y->p)->lch) (y->p)->lch=NULL;
else (y->p)->rch=NULL;
}else if (y->rch==NULL && y->p) ...{
if(y==y->p->lch) y->p->lch=y->lch;
else y->p->rch=y->lch;
}else if (y->lch==NULL && y->p) ...{
if(y==y->p->lch) y->p->lch=y->rch;
else y->p->rch=y->rch;
}else ...{
BITREE t=BST_Successor(y);
y->data=t->data;
BST_Delete(t);
y=t;
}
free(y);
}
BITREE Creat( int d) // 建立节点
... {
BITREE tmp = (BITREE)malloc(sizeof(BTNODE));
tmp->data = d;
tmp->p=tmp->lch=tmp->rch = NULL;
return tmp;
}
参考书:算法导论。