【数据结构——树表的查找(动态查找表)】

【数据结构——树表的查找(动态查找表)】

动态查找表(基于树的查找法)

当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。
改用动态查找表——几种特殊的树
表结构在查找过程中动态生成。
对于给定值:
若表中存在,则返回成功;
否则,插入关键字等于key的记录

(一)二叉排序树

1、定义

二叉排序树又称二叉查找树
定义:
二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:

在这里插入图片描述实例——判断二叉排序树
在这里插入图片描述
二叉排序树的存储结构:二叉链表表示

//二叉排序树的存储结构
typedef struct
{
	KeyType key;					//关键字项
	InfoType otherinfo;				//其他数据项
}ElemType;							//每个结点的数据域的类型

typedef struct BSTNode
{ //结点结构
	ElemType data;					//数据域
	struct BSTNode* lchild, * rchild;	//左右孩子的指针
}BSTNode,*BSTree;

2、查找算法

算法思想
在这里插入图片描述
算法描述

typedef struct BSTNode
{ //结点结构
	ElemType data;					//数据域
	struct BSTNode* lchild, * rchild;	//左右孩子的指针
}BSTNode,*BSTree;

BSTree SearchBST(BSTree T, KeyType key)
{
	//在指针T所指的二叉排序树中递归地查找某关键字等于key的数据元素
	//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
	if (!T || key == T->data.key)
		return T;					//查找结束
	else if (key < T->data.key)
		return SearchBST(T->lchild,key);//在左子树中继续查找
	else
		return SearchBST(T->rchild,key);//在右子树中继续查找
} 

二叉排序树的查找分析
(1)在二叉排序树上查找其他关键字等于给定值的结点的过程,恰是走了一条从根结点到该结点的路径的过程。
比较的关键字次数=次结点所在的层次数
最多比较次数=树的深度
(2)但 二叉排序树平均查找长度和树的形态有关

在这里插入图片描述
在这里插入图片描述

3、插入算法

在这里插入图片描述

typedef struct BSTNode
{ //结点结构
	ElemType data;					//数据域
	struct BSTNode* lchild, * rchild;	//左右孩子的指针
}BSTNode, * BSTree;

//二叉排序树的插入
void InsertBST(BSTree& T, ElemType e)
{//当二叉排序树T中不存在关键字等于e.key的数据元素时,则插入该元素
	if (!T)							//T为空树
	{ //找到插入位置,递归结束
		BSTree S;
		S = new BSTNode;			//生成新结点*S
		S->data = e;				//新结点数据域置为e
		S->lchild = S->rchild = NULL;//新结点*S作为叶子结点
		T = S;						//把新结点*S链接到已找到的插入位置
	}
	else if (e.key < T->data.key)
		InsertBST(T->lchild, e);	//将*S插入左子树
	else if (e.key > T->data.key)
		InsertBST(T->rchild, e);	//将*S插入右子树
}

4、创建算法

在这里插入图片描述

typedef struct BSTNode
{ //结点结构
	ElemType data;					//数据域
	struct BSTNode* lchild, * rchild;	//左右孩子的指针
}BSTNode, * BSTree;

//创建
void CreatBST(BSTree& T)
{ //依次读入一个关键字为key的结点,将此结点插入到二叉排序树T中
	T = NULL;						//将二叉排序树T初始化为空树
	cin >> e;
	while (e.key != ENDFLAG)
	{ //ENDFLAG为自定义常量,作为输入结束标志
		InsertBST(T, e);			//将此结点插入到二叉排序树T中
		cin >> e;
	}
}

5、删除算法

在这里插入图片描述
(1)被删除结点*p为叶子结点
在这里插入图片描述
(2)被删除结点*p只有左子树或者只有右子树

在这里插入图片描述
实例
在这里插入图片描述
(3)被删除结点*p既有左子树又有右子树

在这里插入图片描述
实例
在这里插入图片描述

在这里插入图片描述

算法描述:

//在这里插入代码片

(二)平衡二叉树

1、平衡二叉树的定义

平衡二叉树又称AVL树
一棵AVL树或者是空树,或者是具有下列性质的二叉排序树:
(1)它的左子树和右子树都是AVL树,且左子树和右子树的深度之差的绝对值不超过1
(2)左子树和右子树也是AVL树

在这里插入图片描述
···每个结点附加一个数字,给出该结点的平衡因子BF:该结点的左子树深度和右子树深度之差。
···AVL树任一结点平衡因子只能取-1,0,1

在这里插入图片描述

2、如何构造平衡二叉树

如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡

调整方法:找到离插入点最近且平衡因子绝对值超过1的祖先结点,以该结点为根的子树称为最小不平衡子树,可将重新平衡的范围局限于这棵子树。

平衡调整的四种类型
在这里插入图片描述
LL型调整:
在这里插入图片描述
在这里插入图片描述
RR型调整:
在这里插入图片描述在这里插入图片描述
LR型调整:

在这里插入图片描述在这里插入图片描述在这里插入图片描述
RL型调整:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、AVL的插入

在这里插入图片描述实例:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

(三)B-树

1、B-树的概念

在这里插入图片描述

2、B-树的结点特点

在这里插入图片描述
在这里插入图片描述

3、B-树的特点

在这里插入图片描述
在这里插入图片描述

4、B-树的搜索算法

在这里插入图片描述

该资源包含了几乎所有的数据结构的动画视频,帮助我们更好的理解数据结构算法的编程思路。 目录如下: 'B树的删除.swf', 'B树的生长过程.swf', '三元组的转置.swf', '中序线索化二叉树.swf', '串的顺序存储.swf', '二分查找.swf', '二叉排序树的删除.swf', '二叉排序树的生成.swf', '二叉树的建立.swf', '克鲁斯卡尔算法构造最小生成树.swf', '冒泡排序.swf', '分块查找.swf', '单链结点的删除.swf', '单链结点的插入.swf', '图的深度优先遍历.swf', '基数排序.swf', '堆排序.swf', '头插法建单链.swf', '寻找中序线索化二叉树指定结点的前驱.swf', '寻找中序线索化二叉树指定结点的后继.swf', '尾插法建.swf', '希儿排序.swf', '开放定址法建立散列.swf', '归并排序.swf', '循环队列操作演示.swf', '快速排序.swf', '拉链法创建散列.swf', '拓扑排序.swf', '最短路径.swf', '朴素串匹配算法过程示意.swf', '构造哈夫曼树的算法模拟.swf', '构造哈夫曼树过程.swf', '栈与递归.swf', '树、森林和二叉树的转换.swf', '桶式排序法.swf', '直接插入排序.swf', '直接选择排序.swf', '邻接示的图的广度优先遍历.swf', '邻接示的图的深度优先遍历.swf', '顺序查找.swf', '顺序栈(4个存储空间).swf', '顺序栈(8个存储空间).swf', '顺序的删除运算.swf', '顺序的插入.swf', '顺序队列操作.swf'。 (注:.swf动画格式可直接使用播放器打开。)
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FEI..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值