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

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

一、树表的查找


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.平衡二叉树的构建


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

相关文章
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
525 4
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
434 2
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
393 17
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
582 0
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
433 4
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
462 0
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
978 0
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
597 2

热门文章

最新文章