目录

1. 数据结构树–>树基础
2. 数据结构树–>二叉树
3. 数据结构树–>二叉查找树\二叉排序树
4. 数据结构树–>平衡二叉树
5. 数据结构树–>霍夫曼树
6. 数据结构树–>红黑树
7. 数据结构树–>二叉堆
8. 数据结构树–>B树
9. 数据结构树–>B+树

二叉查找树\二叉排序树

二叉查找树是一种有序的二叉树,也叫儿叉排序树,它在二叉树的基础上添加了位置排序的规则。
规则: 每颗子树的根节点值比左子树大,比右子树小。

二叉查找树的缺点: 二叉查找树有了排序,但当我们的数据顺序与大小规律一致是就会发现,二叉查找树基本退化为了链表,导致达不到二叉

查找树快速查找的目的。

后续我们在介绍平衡二叉树的时候会解决之一问题。

1. 二叉查找树的查找

更具儿叉查找树的特性二叉查找树查找元素快速简单,快速:二叉查找树查找基本就是二分查找,所以快速。

2. 二叉查找树的插入

首先二叉查找树新插入的节点必定是新叶子节点。

如图,节点6并不会插入到节点5与节点7之间,而是插入到节点5的右孩子节点,新的节点是新叶子节点。

3. 二叉查找树的删除

二叉查找树的删除就有点复杂了,删除节点会破坏二叉查找树的结构,我们删除完节点后需要恢复该结构,在充分理解了二叉树的特性后你又能很容易的理解。

需要理解的特性:每颗子树的根节点的值比左子树大,比右子树小。

  1. 据特性1,我们能推倒出每颗子树可以一直向左查找,查到叶子节点就是该子树的最小值,一直向右查找,查到叶子节点就是该子树的最大值。

二叉查找树的删除分三种情况:

  1. 删除的节点是叶子节点。
  2. 删除的节点只有一个子树。
  3. 删除的节点有两个子树。

3.1 删除的节点是叶子节点

这个很简单,我们了解叶子节点的特性,叶子节点可以直接删除不会破坏查找树的结构。

3.2 删除的节点只有一个子树

我们了解的二叉查找树的特性,如果一个节点只有一个子树,那么这个子树不管是左子树还是右子树,这个子树直接赋值到该节点的父节点上也是不会破坏

查找树的结构的。

如图删除节点4,根据二叉查找树排序的特性我们知道节点4的子树相对于它的父节点的排序与结构特性也是符合的,所以我们就可以将节点4的子树直接按照

节点4相对于节点4的父节点的左右区分赋值给节点4的父节点。也就是节点4属于父节点的左子树,删除节点4,节点4的子树赋值给父节点的左子树。

节点4属于父节点的右子树,子树就赋值给父节点的右子树,不用区分子树是属于节点4的左子树还是右子树。

3.3 删除的节点有两个子树

如图当我们要删除节点3的时候就会破坏二叉查找树的结构,我们删除后需要恢复该节点的结构。怎么恢复呢?需要确认那个节点来代替节点3的位置,如果使用右子树根节点5

来代替那节点4就需要动,使用左子树同样会出现这个问题。

我们了解二叉查找树的特性,每颗子树的根节点大于所有左子树,小于所有右子树,我们需要在左右子树中找出符合这个特性的节点来替代节点3,这个替代过程也要简单无需移动

太多。符合这个要求的节点我们根据二叉查找树的特性就能找到,最好的节点就是要删除的节点3的左子树最大值,右子树的最小值,也就是左子树的最右叶子节点,右子树的最左

叶子节点。我们通常使用的是右子树的最左节点(最小值)来替代节点3。

3.4 java 代码实现

   public static void delete(BinaryTreeNode root, int key) {BinaryTreeNode father = root;BinaryTreeNode delete = null;//delete节点属于father的那个方向boolean left = true;while (father != null) {if (father.getKey() < key) {if (father.getRight() != null && father.getRight().getKey() == key) {delete = father.getRight();left = false;break;} else {father = father.getRight();}} else {if (father.getLeft() != null && father.getLeft().getKey() == key) {delete = father.getLeft();left = true;break;} else {father = father.getLeft();}}}if (father != null) {System.out.println("father key=" + father.getKey() + "      delete key=" + delete.getKey());BinaryTreeNode l = delete.getLeft();BinaryTreeNode r = delete.getRight();if (l == null && r == null) {//删除的节点是叶子节点if (left) {father.setLeft(null);} else {father.setRight(null);}} else if (l == null || r == null) {//删除的节点只有一个子树if (left) {if (l == null) {father.setLeft(delete.getRight());} else {father.setLeft(delete.getLeft());}} else {if (l == null) {father.setRight(delete.getRight());} else {father.setRight(delete.getLeft());}}} else {//删除的节点有两个子树//找到右子树的最小值BinaryTreeNode tempFather = delete;BinaryTreeNode min = null;Stack<BinaryTreeNode> temps = new Stack<>();temps.add(tempFather);tempFather = tempFather.getRight();while (true) {temps.push(tempFather);if (tempFather.getLeft() == null) {break;} else {tempFather = tempFather.getLeft();}}min = temps.pop();tempFather = temps.pop();if (left) {father.setLeft(min);} else {father.setRight(min);}if (temps.size() > 0) {//这个判断 tempFather 不是为delete节点 如果最小值有右子树则赋值右子树。if (min.getRight() != null) {tempFather.setLeft(min.getRight());}min.setLeft(delete.getLeft());min.setRight(delete.getRight());} else {if (min.getRight() != null) {tempFather.setRight(min.getRight());}min.setLeft(delete.getLeft());}}}}

数据结构树-->二叉查找树\二叉排序树相关推荐

  1. 数据结构树、二叉树、完全二叉树、二叉查找树、平衡二叉树、红黑树、B+树

    树.二叉树.平衡二叉树.二叉搜索树 树的前序遍历.中序遍历和后序遍历 树的前序遍历.中序遍历和后续遍历是以遍历时根所在的位置顺序命名的.层次遍历即按层从上至下,从左至右遍历即可. 前序遍历:根-> ...

  2. [转]C#与数据结构--树论--平衡二叉树(AVL Tree)

    C#与数据结构--树论--平衡二叉树(AVL Tree) http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html 介绍 我们知道在二 ...

  3. 数据结构:二叉查找树(C语言实现)

    数据结构:二叉查找树 二叉查找树 基础知识 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 二叉查找树的特征 二叉查找树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左 ...

  4. python数据结构-树

    树 树是数据元素之间具有层次关系的非线性结构,由n个节点构成的有限集合,节点数为0的树叫空树 树: 有且仅有一个被称为根的节点 其余节点可分为m个互不相交的有限集合,每个集合又构成一棵树,叫做根节点的 ...

  5. 数据结构-树与深度优先遍历

     笔者在读书时,选择的专业是计算机科学,但和大家一样,在处理线性的问题时较为熟悉,但当自己在尝试理解树和图这种非线性结构时,就总无法深刻准确的理解,为此,也很苦恼很无奈,但也没有什么好的办法.这次趁着 ...

  6. java二叉排序树_数据结构与算法—二叉排序树(java)

    前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度.规则相对是简单的. 再数据结构中树.图才是数据结构标志性产物,(线性表大多都现成api可以使用),因为树的难度相比线性表大一 ...

  7. 数据结构树-->B树

    目录 1. 数据结构树–>树基础 2. 数据结构树–>二叉树 3. 数据结构树–>二叉查找树\二叉排序树 4. 数据结构树–>平衡二叉树 5. 数据结构树–>霍夫曼树 6 ...

  8. 走进数据结构 - 树(Tree)的世界

    前言:         树是各种数据结构中最重头戏的结构.树的各种分类及其子类的各种特征,也是在算法研究和实践中最有价值的学问.本人基于自己的学识和见闻,打算写一篇树的前世今生和树的大家族的介绍,由于 ...

  9. 数据结构树-->霍夫曼树

    目录 1. 数据结构树–>树基础 2. 数据结构树–>二叉树 3. 数据结构树–>二叉查找树\二叉排序树 4. 数据结构树–>平衡二叉树 5. 数据结构树–>霍夫曼树 6 ...

最新文章

  1. 浅析Spring——控制反转IoC
  2. 【转】Kconfig,Makefile 和 .config
  3. SIP协议学习2-pjsip
  4. STM32工作笔记0027---理解电阻的串联和并联
  5. 南阳oj a+b问题
  6. Java 11 将至,不妨了解一下 Oracle JDK 之外的版本
  7. 实现两个虚拟域内用户相互收发邮件
  8. Linux学习笔记(二十三)shell介绍、history命令历史、命令补全和别名、通配符、...
  9. 为什么少有人在Windows电脑上安OS X?
  10. 《孙子兵法战场机变之军争篇》
  11. 360 度测试:Kafka 会丢数据么?其高可用是否满足需求?
  12. Vulnerabilities in multi-factor authentication:多因素身份验证漏洞
  13. 软考2022下半年上午题真题和知识点整理
  14. UVA11021 Tribles 概率
  15. 入网模组 | 广和通G510无线GPRS模块接入方案
  16. iris web框架无法加载静态文件
  17. AIX5.3上使用smit installp 安装Python 3.5.2
  18. Android拾遗——如何反编绎APK文件
  19. 蠡测机房重构之组合查询
  20. 构建高性能微服务架构(网易)

热门文章

  1. windows平台下的进程内存修改
  2. 推荐一系列优秀的Android开发源码(转自安卓巴士)
  3. JVM-Shenandoah GC-29
  4. (转载)二次剩余(知识总结+板子整理)
  5. 四年级计算机下册word教学设计,四年级下册信息技术《我的地盘我做主》教学设计...
  6. 罩形件冲压模具设计及制造(论文+CAD图纸)
  7. 【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?
  8. mybatis mapper-locations作用
  9. 關於基於WinCE下的聲音系統調試的一些經驗總結之驱动程式部分(二)
  10. 五原县扬帆志愿者协会开展“春节慰问送温暖,年味渐浓情更深”新春慰问活动