二叉搜索树
定义:
- 非空左子树的所有键值小于其根结点的键值
- 非空右子树的所有键值大于其根结点的键值
- 左右子树都是二叉搜索树
#define ElementType int
typedef struct TNode *BinTree;
typedef BinTree Position;
struct TNode{
ElementType Data;
BinTree Left,Right;
};
查找
Position Find(ElementType X,BinTree BST){
BinTree T=BST;
// //尾递归
// if(!BST)
// return NULL;
// ElementType NotFound=-1;
// if(X>T->Data)
// return Find(X,T->Right);
// else if(X<T->Data)
// return Find(X,T->Left);
// else
// return T;//若找到,返回地址
//非递归
while(T){
if(X>T->Data)
T=T->Right;
else if(X<T->Data)
T=T->Left;
else
return T;//若找到,返回地址
}
return NULL;//二叉搜索树为空或没找到
}
查找最值
Position FindMax(BinTree BST){
//最大元素一定在树的最右分支的端结点上
BinTree T=BST;
// while(T){
// if(T->Right)
// T=T->Right;
// else
// return T;
// }
if(T)
while(T->Right) T=T->RightL;
return T;
}
Position FindMin(BinTree BST){
//最小元素一定在树的最左分支的端结点上
BinTree T=BST;
// if(T)
// while(T->Left) T=T->Left;
// return T;
if(!T)return NULL;
if(T->Left)
return FinfMin(T->Left) ;
else
return T;
}
插入
BinTree Insert(ElementType X,BinTree BST){
if(!BST){//只要是需要插入新元素,最后都归于此步
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=X;
BST->Left=BST->Right=bull;
}else{
if(X<BST->Data)
BST->Left=Insert(X,BST->Left);
else if(X>BST->Data)
BST->Right=Insert(X,BST->Right);
//X==BST->Data,什么都不做
}
return BST;
}
删除
BinTree Delete(ElementType X,BinTree BST){
Position Tmp;
if(!BST) printf("要删除的元素未找到!\n");
else if(X<BST->Data)
BST->Left=Delete(X,BST->Left);
else if(X>BST->Data)
BST->Right=Delete(X,BST->Right);
else{//找到要删除元素的结点
if(BST->Left&&BST->Right){//左右结点都有
//用右子树中最小元素替代要删除元素或者用左子树中的最大元素替代
Tmp=FindMin(BST);
BST->Data=Tmp->Data;
BST->Right=Delete(BST->Data,BST->Right);//在右子树中删除替换元素所在结点
}else{//最多有一个结点
Tmp=BST;
if(!BST->Left)
BST=BST->Right;
else if(!BST->Right)
BST=BST->Left;
free(Tmp);
}
}
return BST;
}