二叉树的查找操作——递归
Position Find(ElementType X,BinTree BST)
{
if(!BST)
return NULL;//空的二叉搜索树
if(X>BST->Data)
return Find(X,BST->Right);//在右子树中继续查找
else if(X<BST->Data)
return Find(X,BST->Left);//在左子树中继续查找
else //X=BST->Data;
return BST;//查找成功,返回结点的找到结点的地址
}
二叉树的查找操作——迭代
Position IterFind(ElementType X,BinTree BST)
{
while(BST)
{
if(X>BST->Data)
BST=BST->Right;//向右子树中移动,继续查找
else if(X<BST->Data)
BST=BST->Left;//向左子树中移动,继续查找
else
return BST;
}
return NULL;//查找失败
}
总的来说迭代比递归更容易理解,执行效率也更高。递归代码较简单。
查找的效率取决于树的高度。
查找最小元素——递归
Position FindMin(BinTree BST)
{
if(!BST)//空的二叉搜索树,返回NULL
return NULL;
if(!BST->Left)
return BST;//找到最左叶结点,并返回
else
return FindMin(BST->Left);//沿左分支继续查找
}
查找最大元素——迭代
Position FindMAX(BinTree BST)
{
if(BST)
while(BST->Right)
{
BST=BST->Right;//沿右分支继续查找
}
return BST;
}
分别用递归和迭代方式查找最小和最大元素。
二叉树的插入
Position Insert(ElementType X,BinTree BST)
{
if(!BST)
{//若原树为空,生成并返回一个结点的二叉搜索树
BST=malloc(sizeof(struct BinTree));
BST->Data=X;
BST->Left=BST->Right=NULL;
}
//开始找要插入元素的位置
else if(X>BST->Data)
BST->Right=Insert(X,BST->Right);//递归插入右子树
else if(X<BST->Data)
BST->Left=Insert(X,BST->Left);//递归插入左子树
return BST;
}
if(!BST)用来完成最后的插入操作,剩下的语句对插入的位置进行查找,return BST语句返回插入结点的位置。
二叉树的删除
Position Delete(ElementType X,BinTree BST)
{
if(!BST)printf("要删除的元素未找到");
else if(X>BST->Data)
BST->Right=Delete(X,BST->Right);//右子树递归删除
else if(X<BST->Data)
BST->Left=Delete(X,BST->Left);//左子树递归删除
else
{
if(BST->Left&&BST->Right)
{
Position tmp=FindMin(BST->Right);//在右子树中找最小的元素填充删除结点
BST->Data=tmp->Data;
BST->Right=Delete(BST->Data,BST->Right);
}
else
{//被删除结点有一个或无子结点
Position tmp=BST;
if(!BST->Left)//有右孩子或无子结点
BST=BST->Right;
else if(!BST->Right)//有左孩子或无子结点
BST=BST->Left;
free(tmp);
}
return BST;
}
}
分为删除位置有左右子树与只有一个或无左右子树两种情况。
删除位置有左右子树的情况,此处采用了在右子树中查找最小值替换删除位置的方式(还可在左子树中查找最大值替换),然后需要完成替换位置结点的删除。
删除位置只有一个或无左右子树的情况下,只需让BST指向它的左子树或右子树进行替换,然后释放原来的BST即可。