1.动态查找
/*递归*/
Position Find(BinTree BST,ElementType X)
{
if(!BST) return NULL;
if(X>BST->Data) return Find(BST->Right,X);
else if(X<BST->Data) return Find(BST->Left,X);
else return BST;
}
/*非递归*/
Position Find(BinTree BST,ElementType X)
{
while(BST)
{
if(X>BST->Data) BST=BST->Right;
else if(X<BST->Data) BST=BST->Left;
else break;
}
return BST;
}
2.插入
BinTree Insert(BinTree BST,ElementType X)
{
if(!BST) /*若原数为空,生成并返回一个结点的二叉搜索树*/
{
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=X;
BST->Left=BST->Right=NULL;
}
else
{
if(X<BST->Data) BST->Left=Insert(BST->Left,X);
else if(X>BST->Data) BST->Tight=Insert(BST->Right,X);
/*else X已存在。什么都不做*/
}
return BST;
}
/*只能插入叶结点?*/
3.删除
BinTree Delete(BinTree BST,ElementType X)
{
Position Tmp;
if(!BST) printf("要删除的元素为找到");
else
{
if(X<BST->Data) BST->Left=Delete(BST->Left,X);
else if(X>BST->Data) BST->Right=Delete(BST->Right,X);
else
{
/*BST就是要被删除的结点*/
/*如果被删除的结点有左右两个子结点*/
if(BST->Left&&BST->Right)
{
Tmp=FindMin(BST->Right); /*从右子树中找最小的元素填充删除结点*/
BST->Data=Tmp->Data;
BST->Right=Delete(BST->Right,BST->Data); /*从右子树中删除最小元素*/
}
else
{
/*被删除结点有一个或无结点*/
Tmp=BST;
if(!BST->Left) BST=BST->Right; /*只有右孩子或无子结点*/
else BST=BST->Left; /*只有左孩子*/
free(Tmp);
}
}
}
}