查找问题:
- 静态查找(只有查找操作)与动态查找(查找、插入、删除操作)
- 针对动态查找,数据如何组织?
什么是二叉搜索树?
- 二叉搜索树(Binary Search Tree),也称二叉排序树或二叉查找树
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树都是二叉搜索树。
二叉搜索树操作的特别函数:
- Position Find(ElementType X,BinTree BST):从二叉搜索树BST中查找元素X,返回其所在结点的地址;
- Position FindMin(BinTree BST):从二叉搜索树BST中查找并返回最小元素所在结点的地址;
- Position FindMax(BinTree BST):从二叉搜索树BST中查找并返回最大元素所在结点的地址。
- BinTree Insert(ElementType X,BinTree BST)
- BinTree Delete(ElementType X,BinTree BST)
二叉搜索树的查找操作:Find
- 查找从根结点开始,如果树为空,返回NULL
- 若搜索树非空,则根结点关键字和X进行比较,并进行不同处理
- 若X小于根结点键值,只需在左子树中继续搜索
- 如果X大于根结点的键值,在右子树中进行继续搜索
- 若两者比较结果是相等,搜索完成,返回指向此结点的指针。
// 尾递归实现
Position Find(ElementType X,BinTree BST)
{
if (!BST)
return NULL;
if (X>BST->Data)
return Find(X,BST->Right);
if (X<BST->Data)
return Find(X,BST->Left);
else
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) return 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;
}