#每周一算法# 本周介绍一下二叉查找树,二叉查找树一般用的不是很多,但是它是平衡二叉树和红黑树的基础,所以还是要好好了解一下的。
首先说一下什么是二叉查找树:
二叉查找树是一种特殊的二叉树,特殊在哪呢?
1.对于树中的任意节点X,如果它的左子树不为空,则左子树中的所有节点的值均小于X的值。
2.对于树中的任意节点X,如果它的右子树不为空,则右子树中的所有节点的值均大于X的值。
3.二叉查找树的中序遍历是一个从小到大的有序序列。
如图这是一个二叉查找树:
下面这个不是二叉查找树,因为节点8是节点7的左子树,其值不能大于7:
下面来看一下二叉查找树的一些基本操作:
1.插入操作:
将新节点X插入到树T中,进行如下判断:
1.如果T是空树,则X作为树T的根节点
2.如果X的值小于根节点的值,则将X节点插入到左子树中,然后通过递归比较左子树的节点,直到插入到合适的位置
3.如果X的值大于根节点的值,则将X节点插入到右子树中,然后通过递归比较右子树的节点,直到插入到合适的位置
看下面的例子:
2.查找操作
查找操作比较简单,如果该值等于根节点的值,则直接返回。如果该值大于根节点的值,则到右子树中进行递归查找,然后返回查询结果。如果该值小于根节点的值,则到左子树中进行递归查找,然后返回查询结果。
3.删除操作
1.如果该节点是叶子节点,则直接将其删除
2.如果该节点有一个子节点,则将该节点的父节点指向该节点的子节点,然后将该节点删除。
3.如果该节点有两个子节点,一般的删除策略是用该节点的右子树中的最小节点值代替该节点的值,然后再递归的删除该最小节点,因为这是最小的节点,不可能再有左子树,所以删除的时候会简单一些(因为没有左子树所以该节点最多只有一个右子树,删除策略同2)。
看下面的例子:
概念介绍完了,现在用程序来实现一个简单的二叉查找树
package com.algorithm; /** * 二叉查找树 * @author 马永华 * */ public class Bst { //定义二叉树的数据结构 static class BinaryNode<T> { private T element; private BinaryNode<T> left; private BinaryNode<T> right; //创建一个单节点 public BinaryNode(T element){ this(element,null,null); } //创建子节点 public BinaryNode(T element,BinaryNode<T> left,BinaryNode<T> right){ this.element = element; this.left = left; this.right = right; } } //插入 public BinaryNode<Integer> insert(Integer i,BinaryNode<Integer> node){ if(node == null){ return new BinaryNode<Integer>(i); } //如果i 小于当前节点的值,则查找器左子树 if(i < node.element) { node.left = insert(i,node.left); } //如果i 大于当前节点的值,则查找其右子树 if(i > node.element) { node.right = insert(i,node.right); } return node; } //查找 public BinaryNode<Integer> find(int i,BinaryNode<Integer> node){ //如果树为空,则直接返回null if(node == null) return null; if(node.element == i) return node; if(i < node.element) return find(i,node.left); if(i > node.element) return find(i,node.right); System.out.println("这里会执行吗"); return null; } //查询树的最大值 public BinaryNode<Integer> findMax(BinaryNode<Integer> node){ //如果树为空,则直接返回null if(node == null) return null; if(node.right == null) return node; else return findMax(node.right); } //查询树的最小值 public BinaryNode<Integer> findMin(BinaryNode<Integer> node){ //如果树为空,则直接返回null if(node == null) return null; if(node.left == null) return node; else return findMin(node.left); } //获得当前节点的父节点 public BinaryNode<Integer> findParent(int i,BinaryNode<Integer> node){ if(node == null) return null; //如果i的值小于 if(i<node.element){ if(node.left != null &&i == node.left.element) return node; else return findParent(i,node.left); } //如果该值 if(i>node.element){ if(node.right != null && i == node.right.element) return node; else return findParent(i,node.right); } return null; } //删除节点 public BinaryNode<Integer> delete(int i,BinaryNode<Integer> node){ if(node == null) return null; if(i<node.element){ //如果要删除的节点小于当前节点 node.left = delete(i,node.left); }else if(i>node.element){ //如果要删除的节点大于当前节点 node.right = delete(i,node.right); }else { //要删除的节点等于当前节点 //如果该节点有两个子节点 if(node.left !=null && node.right !=null){ //找到该节点右子树中最小的节点,将它的值赋给当前节点 node.element = findMin(node.right).element; //然后递归去删除这个最小的节点 node.right = delete(node.element,node.right); }else { //如果该节点有一个子节点或者没有子节点 return node = node.left != null ? node.left : node.right; } } return node; } //对二叉查找树进行中序输出,输出的是一个从小到大的有序数列 public void sort(BinaryNode<Integer> node){ //先输出左子树 if(node.left != null){ sort(node.left); } //再输出中间 System.out.print(node.element+"->"); //最后输出右子树 if(node.right != null){ sort(node.right); } } public static void main(String args[]){ Bst bst = new Bst(); //插入 6 2 8 1 5 3 4 BinaryNode<Integer> root = bst.insert(6, null); bst.insert(2, root); bst.insert(8, root); bst.insert(1, root); bst.insert(5, root); bst.insert(3, root); bst.insert(4, root); //查询 BinaryNode<Integer> node2 = bst.find(2, root); BinaryNode<Integer> node0 = bst.find(0, root); BinaryNode<Integer> nodeMax = bst.findMax(root); BinaryNode<Integer> nodeMin = bst.findMin(root); //排序 bst.sort(root); //删除 // BinaryNode<Integer> delete4 = bst.delete(4,root); // BinaryNode<Integer> delete3 = bst.delete(3,root); // BinaryNode<Integer> delete2 = bst.delete(2,root); } }
相关推荐
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
杂货产品检测43-YOLO(v5至v9)、CreateML、Paligemma、TFRecord、VOC数据集合集.rarIPCV分配-V6 2024-01-21 6:10 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括7012张图像。 家庭废物以createMl格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。
谁喜欢谁下载,没啥商业价值,comsol也能做,不过我这产量更大
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
推箱子Python小游戏
该新媒体视域下的中国古诗词展演主要为管理员和用户两类用户角色提供需求,管理员在后台可以对系统进行全面管理,用户在前台可以进行查看系统信息,注册登录,查询校园失物,评论,下载校园失物等操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7
内容概要:本文介绍了使用MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多特征分类预测模型。通过PSO优化BiLSTM模型的超参数、引入注意力机制增强模型的特征提取能力,提升了多维度数据的分类精度。模型在金融风险预测、医疗健康预测、交通流量预测等多个领域具有广泛的应用前景。项目详细描述了模型架构、代码实现、训练与优化、模型评估与可视化、以及GUI界面设计等方面的内容。 适合人群:具备一定编程基础,工作1-3年的数据科学家和机器学习工程师。 使用场景及目标:① 金融、医疗、交通等领域的多特征分类预测任务;② 结合PSO优化BiLSTM超参数、引入注意力机制,提升模型预测准确度。 阅读建议:本文详细讲解了模型的理论背景、算法实现和应用案例,适合希望深入理解深度学习和优化算法的读者。建议结合代码和实际数据进行实验,以便更好地掌握模型的设计和优化过程。
Java项目-基于SSM的物资管理系统项目源码
Video_2024-12-18_000023.wmv
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
系统实现: 用户功能模块:用户点击进入到系统操作界面,可以对主页、个人中心、我的收藏管理、订单管理等功能模块,我的收藏管理:通过列表可以获取用户ID、收藏ID、表名、收藏名称、收藏图片信息并进行修改操作 管理员功能模块:管理员通过用户名和密码填写完成后进行登录。管理员登录成功后进入到系统操作界面,可以对主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等功能模块进行相对应操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
1、嵌入式物联网单片机项目开发实战。例程经过精心编写,简单好用。 2、代码使用KEIL 标准库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7
Java项目-基于SSM的网上淘书吧
内容概要:本文详细介绍了 Oracle 19c 中的闪回技术,包括闪回查询、闪回事务查询、闪回丢弃、闪回表、闪回数据库和闪回归档。具体讲解了每种闪回技术的原理、配置方法、操作步骤和限制条件,并提供了具体的实例和 SQL 命令。目的是帮助数据库管理员和开发人员理解和掌握如何利用这些技术来提高数据恢复和错误修复的能力,减少数据库管理的复杂性和风险。 适合人群:Oracle 数据库管理员、数据库开发人员及维护人员。 使用场景及目标:① 使用闪回技术快速恢复因误操作或其他错误导致的数据丢失;② 配置闪回技术以实现高效的数据库恢复;③ 在日常运维中监控和管理闪回操作。 其他说明:本文不仅提供了理论上的解释,还包含了实际操作的示例,以便读者能够更好地理解和应用这些技术。