动态查找表之二叉排序树和平衡二叉树(图解+代码详解)

动态查找表:与静态查找表不同的是,动态查找表是在查找过程中动态生成的,即对于给定值key, 若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。

主要分为:二叉排序树、平衡二叉树、B-和B+树。

我们这里主要分析讨论前两种。

二叉排序树


定义

定义:二叉排序树,又称二叉查找树。或者是一颗空树,或者是满足以下性质的二叉树:

  1. 若其左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若其右子树不空,则右子树上所有结点的值均大于它的根结点的值
  3. 其左、右子树也分别为二叉排序树

特点: 二叉排序树的中序遍历序列一定是递增有序的

注意二叉排序树和二叉判定树不要搞混了,这两个区别还是比较大的,二叉判定树是静态查找的折半查找时用到的,遍历了搜索的可能性,而且结点放置的是序号。

构造二叉排序树

我们对于给定序列,取其第一个点为根结点,然后依次选择后续节点边比较边插入。如果比当前结点小,往该节点左子树移动比较,如果比当前结点大,则往该节点右子树移动比较。直到到一个待比较位置为空的位置,就是该节点的最终位置。

文字过于生硬,图解说明一下:

设输入序列为:(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;
	//查找失败
}

<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值