二叉查找树:
性质:对于树中的每个结点x,它的左子树中所有关键字值小于x的关键字值,而它的右子树中所有关键字值大于x的关键字值。
定义:
//定义一个SearchTree
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
//find操作
Position Find(ElementType X,SearchTree T)
{
if(T==NULL)
returne NULL;
if(X<T->Element)
return Find(X,T->Left);
else if(X>T->Element)
return Find(X,T->Right);
else return T;
}
//查找最大值操作
Position FindMax(SearchTree T)
{
if(T==NULL)return NULL;
else if(T->RIght==NULL)return T;
else return FIndMax(T->RIght);
}
//查找最小值操作(非递归)
Position FindMin(SearchTree T)
{
if(T==NULL)return NULL;
while(T->Left!=NULL)
T=T->Left;
return T
}
//插入
SearchTree Insert(ElementType X,SearchTree T)
{
if(T==NULL)
{
T=malloc(sizeof(struct TreeNode));
if(T==NULL)printf("错误");
else
{
T->Element=X;
T->Left=T->Right=NULL;
} //目前为止的功能是如果这个为叶子结点,则创建一个新的元素存放X的值
}
else if(X<T->Element)
T->Left=Insert(X,T->Left); //如果X小于结点的值,则向左边插入。
else if (X>T->Element)
T->Right=Insert(X,T->Right); //如果X大于结点的值,则向右边插入。
return T;
}
删除
SearchTree Delete(ElementType X,SearchTree T)
{
Position TmpCell;;
if(T==NULL)
printf(“error”);
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)
{
TmpCell=FindMin(T->Right);
T->Element=TmpCell->Element;
T->Right=Delete(T->Element,T->Right);
}
else
{
TmpCell=T;
if(T->Left==NULL)
T=T->Right;
else if (T->Right==NULL)
T=T->Left;
free(TmpCell);
}
return T;
}