二叉排序树及实现

二叉排序树及实现

二叉排序树(Binary Sort Tree, BST)又称为二叉查找树。在一般情况下,查询效率要比链表结构要高。对于二叉排序树中的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或右子节点。

  1. 二叉排序树的java实现
public class BSTree {private Node root;void add(Node node) {if (root == null) {root = node;} else {root.add(node);}}void infixOrderSearch() {if (root == null) {System.out.println("二叉树为空,不能遍历");return;}root.infixOrderSearch();}Node find(int value) {if (root == null) {return null;}return root.find(value);}Node findParentNode(int value) {if(root == null){return null;}return root.findParentNode(value);}//删除节点后返回node为根节点的最小节点的值int delRightTreeMin(Node node){Node tmp = node;while(tmp.left != null){tmp = tmp.left;}delNode(tmp.value);return tmp.value;}private void delNode(int value){if(root == null){return;}//查找待删除节点,如果BST只有一个节点直接删除Node targetNode = find(value);if(targetNode == null){return;}if(root.left == null && root.right == null){root = null;return;}//查找待删除节点的节点//1.如果要删除的节点是叶子节点//2.删除有两棵子树的节点//3.删除只有一棵子树的节点Node parentNode = findParentNode(value);if(targetNode.left == null && targetNode.right == null){if(parentNode.left != null && parentNode.left.value == value){parentNode.left = null;}else if(parentNode.right != null && parentNode.right.value == value){parentNode.right = null;}}else if(targetNode.left != null && targetNode.right != null){targetNode.value = delRightTreeMin(targetNode.right);}else{if(targetNode.left != null){if(parentNode != null){if(parentNode.left.value == value){parentNode.left = targetNode.left;}else{parentNode.right = targetNode.left;}}else{root = targetNode.left;}}if(targetNode.right != null){if(parentNode != null){if(parentNode.left.value == value){parentNode.left = targetNode.right;}else{parentNode.right = targetNode.right;}}else{root = targetNode.right;}}}}//节点private static class Node {int value;Node left;Node right;Node(int value) {this.value = value;}//递归形式添加节点,满足二叉排序树的要求void add(Node node) {if (node == null) {return;}//如果待添加节点值比当前节点值小放到左子树,大于等于放到右子树if (node.value < this.value) {//左子树为空直接添加,否则继续寻找if (this.left == null) {this.left = node;} else {this.left.add(node);}                } else {if (this.right == null) {this.right = node;} else {this.right.add(node);}}}//查找节点Node find(int value) {if (this.value == value) {return this;}//待查找值比当前值小,在左子树中查找,若左子树为空则查不到if (this.value > value) {if (this.left == null) {return null;}return this.left.find(value);}if (this.right == null) {return null;}return this.right.find(value);}//查找待删除节点的父节点Node findParentNode(int value) {if((this.left != null && this.left.value == value)|| (this.right != null && this.right.value == value)){return this;}if (this.value > value && this.left != null) {return this.left.findParentNode(value);}if (this.value <= value && this.right != null) {return this.right.findParentNode(value);}return null;}void infixOrderSearch() {if (this.left != null) {this.left.infixOrderSearch();}System.out.println(this);if (this.right != null) {this.right.infixOrderSearch();}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}}public static void main(String[] args) {int[] arr = {7, 3, 10, 12, 5, 1, 9};BSTree bst = new BSTree();for (int i:arr) {bst.add(new Node(i));}bst.delNode(7);bst.infixOrderSearch();}
}

执行结果:

Node{value=1}
Node{value=3}
Node{value=5}
Node{value=9}
Node{value=10}
Node{value=12}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论&#xff1a;一般用inner join来改写in和exist&#xff0c;用left join来改写not in&#xff0c;not exist&#xff1b;&#xff08;本文会比较内连接&#xff0c;包含in子句的子查询&#xff0c;exist的性能 &#xff09; 1. 本文总结自高性能mysql 6…

Python 面向对象——1.基本概念

本章学习链接如下&#xff1a; 基本概念与语法 类&#xff08;Class&#xff09;&#xff1a;定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象&#xff08;Object&#xff09;&#xff1a;类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性&#xff08;一个对象&#xff09;&#xff0c;不是对象的属性&#xff0c;普通函数和构造函数的prototype属性是空对象&#xff5b;&#xff5d;&#xff08;其实有2个属性&#xff0c;一个是constructor&a…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性&#xff0c;转换为ref对象&#xff1b;不同 toRefs与toRef功能一致&#xff0c;但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录 一些交叉编译的配置环境思路分享&#xff1a;P&#xff1a;php编译PHP可能遇到的问题configure阶段&#xff1a;Makefile-make阶段&#xff1a;Makefile-make install阶段&#xff1a; N&#xff1a;Nginx 文章比较水&#xff0c;并没有没解决什么实际问…

java面向对象的继承Shape

* - Shape基类 拥有draw()和erase()两个方法 * - 基于Shape类创建Circle子类 * - 基于Shape类创建Square子类 * - 创建Shape类创建Triangle子类 * - 创建随机形状发生的类(不是子类) * - 定义公共类(测试类),创建Shape类的数组对象长度为10&#xff0c;并为对象数组赋值其内容C…

二维码门楼牌管理应用平台建设:助力场所整改与消防安全

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化&#xff0c;二维码门楼牌管理应用平台的建设成为了提…

el-table 遇到的问题一

点击按钮一&#xff0c;出现table1 点击按钮二&#xff0c;出现table2 刚开始很简单&#xff0c;就用简单的 v-if 添加&#xff0c;但是会出现问题&#xff0c;就是点击按钮一&#xff0c;会出现table1&#xff0c;点击按钮二&#xff0c;会出现table2&#xff0c;再点击按钮…

C++ - STL详解(七)— stack和queue的介绍及使用

目录 一. stack 1.1 stack的介绍 1.2 stack的定义 1.3 stack的使用 ​编辑 二. queue 2.1 queue的介绍 2.2 queue的定义 2.3 queue的使用 一. stack 1.1 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

Java中的消息队列(如RabbitMQ、Kafka)是如何工作的

Java中的消息队列&#xff08;Message Queue&#xff09;是一种用于应用程序之间或应用程序组件之间进行异步通信的机制。消息队列允许发送者&#xff08;生产者&#xff09;将消息发送到队列中&#xff0c;而接收者&#xff08;消费者&#xff09;可以从队列中读取并处理这些消…

代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和、113. 路径总和ii

代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和、113. 路径总和ii 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 513.找树左下角的值 链接: 112. 路径总和&#xff0c;和 113. 路径总和ii 链接: 从中序与后序遍历序…

Debezium系列之:部署Debezium采集Oracle数据库的详细步骤

Debezium系列之:部署Debezium采集Oracle数据库的详细步骤 一、部署Debezium Oracle连接器二、Debezium Oracle 连接器配置三、添加连接器配置四、可插拔数据库与不可插拔数据库一、部署Debezium Oracle连接器 部署的详细步骤可以参考博主这篇技术文章: Debezium系列之:安装…

怎么用3ds MAX制作蜂窝状模型?

1、新建多边形&#xff1a;打开3ds MAX软件&#xff0c;在样条线中新建一个多边形。 2、设置参数&#xff1a;切换到顶视图&#xff0c;设置多边形的参数&#xff0c;例如半径为10&#xff0c;变数为6&#xff0c;以形成一个六边形的基础。 3、复制并形成圆柱状&#xff1a;打开…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时&#xff0c;日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态&#xff0c;定位问题&#xff0c;以及优化性能。下面&a…

深入Git配置

git配置 git config -h usage: git config [<options>]Config file location--global use global config file--system use system config file--local use repository config file--worktree use per-worktree con…

【Java】如何获取客户端IP地址

在项目中往往涉及到“获取客户端IP地址”&#xff0c;常见到下面这样子的代码&#xff1a; package com.utils;import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.reactive.ServerHttpRequest; import java.net…

逻辑运算符

一 介绍 用于连接多个条件&#xff08; 多个关系表达式&#xff09; &#xff0c; 最终的结果也是一个 boolean 值。 &&#xff1a;逻辑与&&&#xff1a;短路与|&#xff1a;逻辑或||&#xff1a;短路或&#xff01; 取反^&#xff1a;异或 二 逻辑运算规则 a&a…

K210基础实验——独立按键中断

前言 学习K210开发板的独立按键和中断功能 一、涉及到的外设资源是K210开发板上的BOOT按键和RGB灯 二、BOOT按键按下&#xff0c;MCU上连接BOOT的IO口变为低电平&#xff0c;松开后为高电平 三、引脚对应关系 BOOT : IO16 RGB灯&#xff1a; R:IO6 G:IO7 B:IO8 四、在…

【linux】多路径|Multipath I/O 技术

目录 简略 详细 什么是多路径? Multipath安装与使用 安装 使用 Linux下multipath软件介绍 附录 配置文件说明 其他解 简略 略 详细 什么是多路径? 普通的电脑主机都是一个硬盘挂接到一个总线上&#xff0c;这里是一对一的关系。 而到了分布式环境&#xff0c;主机和存储网络连…