动态查找表:与静态查找表不同的是,动态查找表是在查找过程中动态生成的,即对于给定值key, 若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。
主要分为:二叉排序树、平衡二叉树、B-和B+树。
我们这里主要分析讨论前两种。
目录
二叉排序树
定义
定义:二叉排序树,又称二叉查找树。或者是一颗空树,或者是满足以下性质的二叉树:
- 若其左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若其右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 其左、右子树也分别为二叉排序树
特点: 二叉排序树的中序遍历序列一定是递增有序的
注意二叉排序树和二叉判定树不要搞混了,这两个区别还是比较大的,二叉判定树是静态查找的折半查找时用到的,遍历了搜索的可能性,而且结点放置的是序号。
构造二叉排序树
我们对于给定序列,取其第一个点为根结点,然后依次选择后续节点边比较边插入。如果比当前结点小,往该节点左子树移动比较,如果比当前结点大,则往该节点右子树移动比较。直到到一个待比较位置为空的位置,就是该节点的最终位置。
文字过于生硬,图解说明一下:
设输入序列为:(30,11,18,4,55,19,15,70,58)

如此便构造成功了一个二叉排序树。
这样一来我们也可以很方便的计算出其平均查找长度,每一层的高度就是查找所花费的次数,例如:

基本操作代码解析
存储结构
首先我们选择使用二叉链表作为其存储结构:
typedef struct BiTNode {
// 结点结构
TElemType data; // 包含key
struct BiTNode *lchild, *rchild; // 左右孩子指针
} BiTNode, *BiTree;
查找操作
递归算法
思路很简单,仅需要从根节点开始比较就可以,比当前结点大就找左子树,小就找右子树直到找到为止
BiTree SearchBST (BiTree T,KeyType key){
//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if( (!T)||EQ(key,T->data.key))
return (T); //查找结束
else if LT(key,T->data.key)
return(SearchBST(T->lchild,key));
//在左子树中继续查找
else
return(SearchBST(T->rchild,key));
// 在右子树中继续查找
} //SearchBST
非递归算法
由于我们这个不需要回溯,实际上也就是使用一个while循环代替递归的工作栈,思路和递归算法差不多。
struct BiTNode *search_tree(struct BiTNode *T, keytype key)
//返回值
失败:NULL 成功:非NULL,结点指针
{
while (T!=NULL)
{
if (key==T->data.key)
return T;
//查找成功
else if (key<T->data.key)
T=T->lchild; //查左子树
else
T=T->rchild; //查右子树
}
return T;
//查找失败
}

&spm=1001.2101.3001.5002&articleId=118500355&d=1&t=3&u=f8124e304e48408a8fa55742c5893497)
1970

被折叠的 条评论
为什么被折叠?



