一、查找
尾递归,执行效率低
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 // X == BST->Data
return BST; // 查找成功,返回结点的地址
}
return NULL; // 查找失败
}
二、最大值与最小值
Position FindMin(BinTree BST)
{
// 查找最小元素的递归函数
if (!BST) return NULL; // 空的二叉搜索树,返回NULL
else if (!BST->Left)
return BST; // 找到最左叶结点并返回
else
return FindMin(BST->Left); // 沿左分支继续查找
}
Position FindMax(BinTree BST)
{
// 查找最大元素的迭代函数
if (BST)
// 沿右分支继续查找,直到最右叶结点
while (BST->Right) BST = BST->Right;
return BST;
}
三、插入
BinTree Insert(ElementType X, BinTree BST)
{
if (!BST) {
// 若原树为空,生成并返回一个结点的二叉搜索树
BST = malloc(sizeof(struct TreeNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else { // 开始找要插入元素的位置
if (X < BST->Data)
// 递归插入左子树
BST->Left = Insert(X, BST->Left);
else if (X > BST->Data)
// 递归插入右子树
BST->Right = Insert(X, BST->Right);
// else X已经存在,什么都不做
}
return BST;
}
四、删除
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);
}
}
}
return BST;
}