当前位置: 首页 > news >正文

二叉搜索树(Java实现)

 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

JavaEE专栏:JavaEE

关注博主带你了解更多数据结构知识

目录

1.概念

2.实现二叉搜索树

定义节点

查找元素

插入元素 

删除元素


1.概念

二叉搜索树又称二叉排序树,或者它是一棵空树,或者是具有以下性质的二叉树:

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

2.实现二叉搜索树

定义节点

static class TreeNode{public int val;public TreeNode left;public TreeNode right;public TreeNode(int val){this.val=val;}}public TreeNode root = null;

查找元素

  //查找public TreeNode seach(int key){TreeNode cur = root;while ( cur != null){  //根节点的值不等于要查找的key值,接下来循环if (cur.val < key){//根节点的值小于key值,让其在右子树继续查找cur = cur.right;}else if(cur.val > key){//根节点的值大于key值,让其在左子树继续查找cur = cur.left;}else {//找到了key值,返回即可return cur;}}return null;//树中没有要找的key值,直接返回null}

插入元素 

1.如果为空,那么直接插入
2.如果不为空,如果小于根则插入左边,大于则插入右边

 //插入public void insert(int val){TreeNode node = new TreeNode(val);if(root == null){root = node;return;}TreeNode cur = root;TreeNode parent = null;while (cur != null){if(cur.val < val){parent = cur;cur = cur.right;}else if(cur.val > val){parent = cur;cur = cur.left;}else {return;}}if(parent.val > val){parent.left = node;}else{parent.right = node;}}

删除元素

 需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点,用它的值填补到被 删除节点中

 //删除public void remove(int key) {TreeNode parent = null;TreeNode cur = root;while (cur != null) {if(cur.val < key) {parent = cur;cur = cur.right;}else if(cur.val > key) {parent = cur ;cur = cur.left;}else {removeNode(parent,cur);return;}}}private void removeNode(TreeNode parent,TreeNode cur) {if(cur.left == null) {if(cur == root) {root = cur.right;}else if(cur == parent.left) {parent.left = cur.right;}else {parent.right = cur.right;}}else if(cur.right == null) {if(cur == root) {root = cur.left;}if(cur == parent.left) {parent.left = cur.left;}else {parent.right = cur.left;}}else {//cur.left!=null&&cur.right!=null,//那么就在cur的左边找到最大值,或者cur的右边找到最小值来替换该元素TreeNode target = cur.right;TreeNode targetP = cur;while (target.left != null) {targetP = target;target = target.left;}cur.val = target.val;if(target == targetP.left) {targetP.left = target.right;}else {targetP.right = target.right;}}}

性能分析:

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:log_{2}N
​最差情况下,二叉搜索树退化为单支树,其平均比较次N数为:\frac{N}{2}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【智路】智路OS Airos Edge 2.0 Quick Start
  • Golang | Leetcode Golang题解之第403题青蛙过河
  • 【VUE】快速上手
  • 【接口测试】Postman--变量与集合
  • Java入门程序-HelloWorld
  • 在 Linux 系统中目录架构说明
  • 算法之搜索--最长公共子序列LCS
  • 传输层协议 —— UDP协议
  • 闲置物品交易系统小程序的设计
  • Go 交叉编译
  • <<编码>> 第 14 章 反馈与触发器(2)--或非门反馈 示例电路
  • Python MongoDB
  • 【C语言零基础入门篇 - 14】:顺序表
  • Android 15 正式发布至 AOSP
  • App及web反编译方案
  • chrome扩展demo1-小时钟
  • ES6 学习笔记(一)let,const和解构赋值
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • spring security oauth2 password授权模式
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端面试题总结
  • 浅谈Golang中select的用法
  • 如何学习JavaEE,项目又该如何做?
  • 使用 Docker 部署 Spring Boot项目
  • 探索 JS 中的模块化
  • 优秀架构师必须掌握的架构思维
  • 正则学习笔记
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (14)Hive调优——合并小文件
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四) Graphivz 颜色选择
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .mysql secret在哪_MySQL如何使用索引
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net6使用WebSocket与前端进行通信
  • .NET连接MongoDB数据库实例教程
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @Autowired和@Resource装配
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @html.ActionLink的几种参数格式
  • [ C++ ] STL---仿函数与priority_queue
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [APIO2015]巴厘岛的雕塑
  • [Bugku]密码???[writeup]
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [CodeForces-759D]Bacterial Melee