二叉查找树

news/2025/1/16 5:33:02/

目录

一、二叉查找树概念

二、结点内部类代码实现:

 三、二叉查找树的插入原理​编辑

四、遍历的方式(中序遍历): 

五、二叉查找树实现指定值删除对应的结点

六、main方法测试


一、二叉查找树概念

二、结点内部类代码实现:

public class BinarySearchTree {//写一个结点内部类public static class Node{int value;Node left;Node right;public Node(int value){this.value = value;}}//先定义一个根节点Node root;
}

 三、二叉查找树的插入原理

//写一个插入类public void insert(int value){//如果树为null,则直接插入在根节点上if (root == null){root = new Node(value);}//声明一个游标结点,开始指向根节点Node node = root;//如果树不为null,则比较插入的值与根节点的大小,小放左边大放右边while(true){if (value < node.value){//如果root.left为null,则直接插入到root.left中if (node.left == null){node.left = new Node(value);break;}else{//将游标指向左子节点node = node.left;}}else {if (node.right ==null){node.right = new Node(value);break;}else {//将游标指向右子节点node = node.right;}}}}

四、遍历的方式(中序遍历): 

1.通过中序遍历就可以将二叉查找树进行顺序输出。

2.中序遍历的特征:左、根、右 

通过中序遍历,刚好可以把二叉查找树从小到大进行遍历输出。

//实现中序遍历public void midTraversal(Node node){if (node == null){return;}//先遍历左子节点midTraversal(node.left);//打印根节点System.out.print(node.value+" ");//再遍历右子节点midTraversal(node.right);}

五、二叉查找树实现指定值删除对应的结点

public static final int LEFT = 0;public static final int RIGHT = 1;//实现删除指定结点public void deleteNode(int value){//定义一个游标指针Node node = root;//定义一个目标结点Node target = null;//定义一个target的父类结点Node parent = null;//定义一个结点类型,左结点为0,右节点为1int nodeType = 0;//先进行查找目标元素while (node != null){//当node等于null的时候说明树中没有目标结点if (node.value == value){//找到结点了target = node;break;}else if (value < node.value){parent = node;//先记录node的父节点node = node.left;//node往左下方遍历nodeType = LEFT;}else {parent = node;node = node.right;nodeType = RIGHT;}}//如果target为null,则表示树中没有此节点if (target == null){System.out.println("没有找到要删除的结点");}//删除结点的三种方式,原理有两种,一种是将父类结点的指针指向新的子节点,// 另一种是将一个子节点的值替换掉目标结点,同时删除那个替换的子节点。//1.如果结点是叶子结点,也就是没有子节点的情况if (target.left == null && target.right == null){//如果树只有一个根节点,删除根节点的情况if (parent == null){//将root设置为null即可root = null;return;}//判断目标的结点是左子节点还是右子节点if (nodeType == LEFT){parent.left = null;}else{parent.right = null;}}else if (target.left != null && target.right != null){//2.如果删除的结点有两个子节点的情况//这种情况下,我们可以选择目标结点的左子树中最大的结点替换目标结点,// 也可以选择右子树中最小的结点替换掉目标结点//从target的右子树中查找最小的值Node min = target.right;while (min.left != null){min = min.left;}//将右子树中最小的值的结点删除deleteNode(min.value);//将最小值覆盖到目标结点上,完成目标结点的删除target.value = min.value;}else{//如果删除的是根节点,且根节点只有一个子节点if (parent == null){if (target.left != null){root = target.left;}else {root = target.right;}return;}//3.如果删除的结点只有一个子节点的情况if (nodeType == LEFT){if (target.left != null){//将父类的子节点指向待删除子节点的左子节点parent.left = node.left;}else {//将父类的子节点指向待删除子节点的右子节点parent.left = node.right;}}else {if (target.left != null){//将父类的子节点指向待删除子节点的左子节点parent.right = node.left;}else {//将父类的子节点指向待删除子节点的右子节点parent.right = node.right;}}}}

六、main方法测试

package Tree.BinarySearchTree;public class TestBinarySearchTree {public static void main(String[] args) {int[] arr2 = {5,2,1,4,3,9,7,6,8};BinarySearchTree bst2 = new BinarySearchTree();
//        //将数组中的元素构造成二叉查询树for (int i = 0;i<arr2.length;i++){bst2.insert(arr2[i]);}//中序遍历bst2.midTraversal(bst2.root);//删除指定元素bst2.deleteNode(9);System.out.println();bst2.midTraversal(bst2.root);}
}


http://www.ppmy.cn/news/41064.html

相关文章

Hudi集成Flink-写入方式

文章目录一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表1.2.3、将 kakfa 数据写入hudi二、…

数据结构与算法基础(王卓)(24)附:邻接表的广度优先遍历算法BFS(学习过程记录)

邻接表的广度优先遍历算法BFS 第一版&#xff1a; void BFS(ALG G, int v) {cout << G.vex[v].data;visited[v] 1;SqQueue Q;InitQueue(Q);auto iG.vex[v].firstarc;while(!QueneEmpty(Q)){ if(visited[i->adjvex]0)EnQueue(Q, i->adjvex);i i->nextarc;BFS…

基于html+css的自适应展示3

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【ROS2指南-7】理解ROS2的Action

目标&#xff1a; 理解并学习ROS 2 中的Action通信方式。 教程级别&#xff1a;初学者 时间&#xff1a; 15分钟 内容 背景 先决条件 任务 1 设置 2 使用动作 3 ros2节点信息 4 ros2 动作列表 5 ros2 动作信息 6 ros2界面展示 7 ros2 动作 send_goal 概括 下一步 …

2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书

2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&…

python数据分析-matplotlib散点图-条形图的绘制以及完整方法归纳02

matplotlib的基本使用02一.散点图的绘制二.散点图绘图步骤及案例解析1.导入模块2.设置散点图所有字符的字体样式3.编写主体代码4.主题代码解析5.图形展示三.条形图的绘制四.条形图案例展示1.导入模块五.绘制条形图完整代码六.条形图展示七.多个条形图展示1.结果展示八.总结一.散…

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景&#xff0c;由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格&#xff0c;起着不同作用的BI数据可视化大屏报表&#xff0c;一起来了解一…

Linux中用shell脚本设置某个可执行文件或者命令自启动

ps:经理给了个需求&#xff0c;要把我们的产品设置自启动&#xff0c;我就说可以用crontab添加到自启动&#xff0c;结果是说那边实施部门去给客户部署产品&#xff0c;不会命令行需要一键脚本设置自启动&#xff0c;好嘛这就又需要shell了。 首先介绍crontab crontab是一个在…