技术好文共享:算法之树表的查找

简介: 技术好文共享:算法之树表的查找

一、树表的查找


1.//代码效果参考:http://www.lyjsj.net.cn/wz/art_23975.html

概念

当表的插入、删除操作比较频繁时,为维护表的有序性,需要移动表中很多记录。需要适用动态查找表—几种特殊的树


表结构在查找过程中动态生成,对于给定key,若表中存在,则成功返回;否则,插入关键字等于key的记录。


有:二叉排序树、平衡二叉树、红黑树、B-树、B+树、建树


2.二叉排序树


也称二叉搜索树、二叉查找树,


1.定义:


二叉排序树或是空树,或是满足以下性质的二叉树:


1.若其左子树非空,则左子树上所有结点的值均小于根结点的值


2.若右子树非空,则右子树上所有结点的值均大于等于根结点的值


3.其左右子树本身又各是一颗二叉排序树


其中左子树上所有结点的值都小于根结点的值,右子树上所有结点的值都大于等于根结点的值。


每个子节点也都遵循整个定义


对二叉排序树进行中序遍历可以得到一个按关键字从小到大的有序表


2.查找算法:


类似于二分法。


typedef struct //代码效果参考:http://www.lyjsj.net.cn/wx/art_23973.html

{ // 定义二叉树结点结构

KeyType key // 关键字项


lnfoType otherinfo // 其他数据域


}ElemType


// 定义二叉树结构


typedef struct BSTNode {


ElemType data; // 数据域


struct BSTNode lchild, rchild // 左右孩子指针


}BSTNode, *BSTree


BSTree T


//查找算法-递归


BSTree SearchBST(BSTree T,KeyType key) {


if((!T) || key == T->data.key) return T


else if(key data.key))


return SearchBST(T->lchid,key) // 继续在左子数中查找


else return SearchBST(T -> rchild, key) // 继续在右子树中继续查找


}


思路:


1.若二叉排序树为空,则查找失败,返回空指针。


2.若非空,将给定值key与根结点的关键字进行比较,类似于二分查找法。


3.插入


思路:


1.若二叉树排序树为空,则插入结点作为根结点插入到空树中


2.若不为空,继续在其左、右子树上查找。


若树中已有,就不再插入.


若树中没有,查找直到某个叶子结点的左子树或右子树为空为止,则插入结点应为叶子结点的左孩子或右孩子


通过插入算法可以生成一个二叉排序树。一个无序序列可通过构造二叉排序树变成一个有序序列。,构造树的过程就是对无序序列//代码效果参考:http://www.lyjsj.net.cn/wx/art_23971.html

进行排序的过程。插入的结点均为叶子结点,无需移动其他结点,相当于在有序序列上插入记录二无需移动其他记录。

4.删除


删除只能和删除结点,不能删除以结点为根的子树,且还要保证删除后所得二叉树仍满足二叉排序树的性质不变。


1.被删除的结点是叶子结点:直接删去该结点。


2.被删除的结点只有右子树或者只有左子树,用其右子树或者左子树替换


3.被删除的结点既有左子树又有右子树,找到删除结点的左子树中的最大值,将其替换删除结点(或者找右子树上最小的结点)


2.平衡二叉树(AVL树)


一颗平衡二叉树或者是空树,或者是具有下列性质的二叉排列树:


左子树与右子树的高度之差的绝对值小于等于1


左子树和右子树也是平衡二叉排列树。


给每一个结点附加一个数字,给出该结点左子树与右子树的高度差。整个数组称为结点的平衡因子(BF)


平衡因子 = 结点左子树 - 结点右子树的高度


根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能说-1,0,1


每一个结点的左右指数相减,都是0或者-1.


对于一颗有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。


当我们在平衡二叉树排序树上插入一个结点时,可能会破坏平衡二叉树使其失衡。需要重新调整。


1.平衡二叉树的失衡处理


平衡二叉树的四种失衡类型:


调整方案:


调整原则:降低树的高度,保存二叉排序树性质。


理解:将某个子树中 结点的值处于中间位置提升至根结点。几种失衡类型就是根据插入值的大小来决定的)


2.平衡二叉树的构建


每插入一个结点都进一次平衡调整。

相关文章
|
1月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
38 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
63 3
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
42 1
|
2月前
|
机器学习/深度学习 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-15
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-15
64 1
|
2月前
|
存储 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
51 0
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-17
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-17
71 0
|
18小时前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
100 80
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
25天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
5天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。