二叉查找树
二叉查找树
struct TreeNode;
typedef struct TreeNode* SearchTree;
typedef struct TreeNode* Position;
struct TreeNode{
ElementType Element;
TreeNode *left;
TreeNode *right;
}
//将树置空的例程
SearchTree MakeEmpty(SearchTree T){
if(T!=NULL){
MakeEmpty(T->left);
MakeEmpty(T->right);
free(T);
}
return Null;
}
//Find 例程
Position Find(ElementType x,SearchTree T){
if(T==NULL){
return NULL;
}
//对于普通树,查找例程如下
// if(T->element==x){
// return T;
// }
// else{
// Find(x,T->left);
// Find(x,T->right);
// }
//但本例程是针对二叉查找树
if(x<T->element){
Find(x,T->left);
}
else if(x>T->element){
Find(x,T->right);
}
else{
return T;
}
}
//FindMax例程,递归实现
Position FindMax(SearchTree T){
if(T==NULL){
return NULL;
}
if(T->right!=NULL){
FindMax(T->right);
}
else{
return T;
}
}
//FindMin例程,非递归实现
Position FindMin(SearchTree T){
if(T==NULL){
return NULL;
}
else{
while(T->left!=NULL){
T=T->left;
}
return T;
}
}
//插入元素到二叉查找树的例程
SearchTree Insert(ElementType x,SearchTree T){
if(T==NULL){
SearchTree T=malloc(sizeof(struct TreeNode));
T->element=x;
T->left=NULL;
T->right=NULL;
}
else{
if(x<T->element){
T->left=Insert(x,T->left);
}
else if(x>T->element){
T->right=Insert(x,T->right);
}
else{
//do nothing;
}
}
return T;
}
//将元素从二叉查找树中删除例程
Position Delete(ElementType x,SearchTree T){
if(T==NULL){
return NULL;
}
else if(x<T->element){
T->left=Delete(x,T->left);
}
else if(x>T->element){
T->right=Delete(x,T->right);
}
else if(T->left && T->right){ //有左右两个儿子
Position TmpCell;
TmpCell=FindMin(T->right);
T->element=TmpCell->element;
T->right=Delete(TmpCell->element,T->right);
}
else if(T->left==NULL){ //没有有左儿子
Position TmpCell=T;
T=T->right;
free(TmpCell);
}
else if(T->right==NULL){ //没有右儿子
Position TmpCell=T;
T=T->right;
free(TmpCell);
}
return T;
}