1、二叉查找树的性质与规则

若一个结点的左子树不为空,则它左子树上所有的结点都小于该结点;若一个结点的右子树的不为空,则它右子树上所有的结点都大于该结点

2、二叉查找树的创建

a、二叉查找树的结点类

public class Node{public Key key;//存储键private Value value;//存储值public Node left;//记录左子结点public Node right;//记录右子结点public Node(Key key,Value value,Node left,Node right) {this.key = key;this.value = value;this.left = left;this.right = right;}
}

b、二叉查找树实现

插入方法(put)实现思想:

  • 如果当前书中没有任何一个结点,则直接把新节点当做根节点使用
  • 如果当前树不为空,则从根节点开始:
  • 如果新结点的key小于当前结点的key,则继续找当前结点的左子结点
  • 如果新结点的key大于当前结点的key,则继续找当前结点的右子结点
  • 如果新结点的key等于当前结点的key,则树中已经存在这样的结点,替换该结点的value值

流程图如下:

查询(get)实现思想:

从根节点开始:

  • 如果要查询的key小于当前结点的key,则继续找当前结点的左子结点
  • 如果要查询的key大于当前结点的key,则继续找当前结点的右子结点
  • 如果要查询的key等于当前结点的key,则返回当前结点的value

删除方法delete实现思想:

  • 找到被删除结点
  • 找到被删除结点右子树的最小结点minNode
  • 删除右子树中的最小结点
  • 让被删除结点的左子树称为最小结点minNode的左子树,让被删除结点的右子树称为最小结点minNode的右子树
  • 让被删除结点的父节点指向最小结点minNode

完整代码

//二叉树代码
class BinaryTree<Key extends Comparable<Key>, Value> {//记录根结点private Node root;//记录树中元素的个数private int N;//获取树中元素的个数public int size() {return N;}//向树中添加元素key-valuepublic void put(Key key, Value value) {root = put(root, key, value);}//向指定的树x中添加key-value,并返回添加元素后新的树private Node put(Node x, Key key, Value value) {if (x == null) {//个数+1N++;return new Node(key, value, null, null);}int cmp = key.compareTo(x.key);if (cmp > 0) {//新结点的key大于当前结点的key,继续找当前结点的右子结点x.right = put(x.right, key, value);} else if (cmp < 0) {//新结点的key小于当前结点的key,继续找当前结点的左子结点x.left = put(x.left, key, value);} else {//新结点的key等于当前结点的key,把当前结点的value进行替换x.value = value;}return x;}//查询树中指定key对应的valuepublic Value get(Key key) {return get(root, key);}//从指定的树x中,查找key对应的值public Value get(Node x, Key key) {if (x == null) {return null;}int cmp = key.compareTo(x.key);if (cmp > 0) {//如果要查询的key大于当前结点的key,则继续找当前结点的右子结点;return get(x.right, key);} else if (cmp < 0) {//如果要查询的key小于当前结点的key,则继续找当前结点的左子结点;return get(x.left, key);} else {//如果要查询的key等于当前结点的key,则树中返回当前结点的value。return x.value;}}//删除树中key对应的valuepublic void delete(Key key) {root = delete(root, key);}//删除指定树x中的key对应的value,并返回删除后的新树public Node delete(Node x, Key key) {if (x == null) {return null;}int cmp = key.compareTo(x.key);if (cmp > 0) {//新结点的key大于当前结点的key,继续找当前结点的右子结点x.right = delete(x.right, key);} else if (cmp < 0) {//新结点的key小于当前结点的key,继续找当前结点的左子结点x.left = delete(x.left, key);} else {//新结点的key等于当前结点的key,当前x就是要删除的结点//1.如果当前结点的右子树不存在,则直接返回当前结点的左子结点if (x.right == null) {return x.left;}//2.如果当前结点的左子树不存在,则直接返回当前结点的右子结点if (x.left == null) {return x.right;}//3.当前结点的左右子树都存在//3.1找到右子树中最小的结点Node minNode = x.right;while (minNode.left != null) {minNode = minNode.left;}//3.2删除右子树中最小的结点Node n = x.right;while (n.left != null) {if (n.left.left == null) {n.left = null;} else {n = n.left;}}//3.3让被删除结点的左子树称为最小结点minNode的左子树,让被删除结点的右子树称为最小结点minNode的右子树minNode.left = x.left;minNode.right = x.right;//3.4让被删除结点的父节点指向最小结点minNodex = minNode;//个数-1N--;}return x;}private class Node {//存储键public Key key;//存储值private Value value;//记录左子结点public Node left;//记录右子结点public Node right;public Node(Key key, Value value, Node left, Node right) {this.key = key;this.value = value;this.left = left;this.right = right;}}
}
//测试代码
public class Test {public static void main(String[] args) throws Exception {BinaryTree<Integer, String> bt = new BinaryTree<>();bt.put(4, "二哈");bt.put(1, "张三");bt.put(3, "李四");bt.put(5, "王五");System.out.println(bt.size());bt.put(1,"老三");System.out.println(bt.get(4));bt.put(2, "小屋");System.out.println(bt.size());bt.delete(2);System.out.println(bt.size());}
}

史上最全二叉查找树详解——带详细图解相关推荐

  1. Unity史上最全旋转详解(Rotate,rotation,localEulerAngles,localRotation,万向节锁)

    Unity史上最全旋转详解 前言 旋转的方法Rotate以及五种重载参数的超级详细理解 Rotate(float xAngle, float yAngle, float zAngle); Unity绕 ...

  2. css中float详解,CSS浮动属性Float详解?史上最全Float详解

    我们在学习css样式的时候,都知道css是盒概念,并且每一个盒子都是一个元素,下面我们就对CSS浮动属性Float进行详解,让你彻底了解Float. 一:什么是Float浮动? Float浮动是css ...

  3. 史上最全ThreadLocal 详解(一)

    目录 一.ThreadLocal简介 二.ThreadLocal与Synchronized的区别 三.ThreadLocal的简单使用 四.ThreadLocal的原理 4.1 ThreadLocal ...

  4. 史上最全RabbitMq详解

    RabbitMq 资料 1.win 安装 第一步:下载并安装erlang RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装RabbitMQ的前提是安装Erlan ,下载地址为 :ht ...

  5. Java泛型详解,史上最全图文详解

    泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它. 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课. 一:泛型本质 Java 泛型(gen ...

  6. show processlist 史上最全参数详解及解决方案

    总目录 一.show processlist 简介 二.show processlist 参数分析 三.show processlist--State参数分析 四.问题排查及解决方案 1.sql语句 ...

  7. android emoji吏上最全的详解

    如果没有时间看这么多历史介绍知识点,请直接跳到 第五小节:<java删除字符串中的所有emoji字符> 一.emoji简介 简介的内容摘自 wiki 百科对emoji的描述.这里把基本概念 ...

  8. 史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录

    title: 程序脱壳篇 date: {{ date }} tags: ['程序壳','程序脱壳篇'] categories: ['程序壳','程序脱壳篇'] excerpt: 壳是最早出现的专用加密 ...

  9. 史上最全!27种神经网络简明图解:模型那么多,我该怎么选?

    27种?!神经网络竟有那么多种?这篇文章将逐一介绍下面这张图片中的27种神经网络类型,并尝试解释如何使用它们.准备好了吗?让我们开始吧! 神经网络的种类越来越多,可以说是在呈指数级地增长.我们需要一个 ...

最新文章

  1. Ambari Server网口带宽占用率很高问题的分析和解决办法
  2. PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent
  3. python 爬预警没解析前的
  4. 【五线谱】高低八度标记 ( 高八度标记 | 标记范围的音符整体提升一个八度 | 低八度标记 | 标记范围的音符整体降低一个八度 )
  5. Tomcat Filter 源码分析
  6. javaweb学习总结(十八)——JSP属性范围
  7. 浅析“字典--NSDirctionary”理论
  8. Tiny模板语言(VelocityPlus)初步入门
  9. linux 磁盘查看方式
  10. 29岁当教授,发表11篇Nature和Science,这位顶尖科学家正式全职回国
  11. 太损了!“特斯拉刹车失灵”同款白T恤已上架电商平台
  12. python中的yield使用详解
  13. a的n次方的快速算法及大数相乘
  14. 黑马程序员java学生管理系统
  15. java开发职业规划
  16. 计算机画图星星怎么画,电脑画图工具 奇奕画王使用教程(附序列号)
  17. SPRAY 光谱光线追迹仿真软件
  18. 怎么在国内创建谷歌账号_如何在Google表格中创建下拉列表
  19. Fedora 30 将默认启用 DNF-best 模式
  20. python counter转换为列表_Python标准库---collections.counter

热门文章

  1. 数据库分区、分表、分库
  2. 6拨盘专业全能相机 尼康P7700详细评测
  3. 本地项目提交代码到git仓库详细教程包含错误解决办法!!!
  4. JDK8和JDK9双版本共存
  5. QtCreator画UML
  6. 【Android】01---界面布局
  7. 优酷全自研跨平台动态模板引擎重磅开源啦!
  8. 如何启用 BitLocker 网络解锁
  9. Android 修改按键音
  10. Azkaban多Executor模式注意事项