目录

1 二叉树

2 二叉查找树

3 平衡二叉树

4 红黑树


笔者会据需补充二叉树的相关一系列知识,先更新最基本的二叉树的知识.

1 二叉树

  • 二叉树的特点

    • 二叉树中,任意一个节点的度要小于等于2

      • 节点: 在树结构中,每一个元素称之为节点

      • 度: 每一个节点的子节点数量称之为度

      • 左子节点 右子节点 值 父节点 定义时一个节点四个变量

  • 二叉树结构图

2 二叉查找树

  • 二叉查找树的特点

    • 二叉查找树,又称二叉排序树或者二叉搜索树

    • 每一个节点上最多有两个子节点

    • 左子树上所有节点的值都小于根节点的值

    • 右子树上所有节点的值都大于根节点的值

  • 二叉查找树结构图

  • 二叉查找树和二叉树对比结构图

二叉查找树添加节点规则

  • 小的存左边
  • 大的存右边
  • 一样的不存

3 平衡二叉树

  • 平衡二叉树的特点

    • 二叉树左右两个子树的高度差不超过1

    • 任意节点的左右两个子树都是一颗平衡二叉树

  • 平衡二叉树旋转

    • 旋转触发时机

      • 当添加一个节点之后,该树不再是一颗平衡二叉树也就是说原来是一颗平衡的添加后不平衡的过程,重复不添加

    • 左旋

      • 就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

右旋

  • 就是将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点

平衡二叉树和二叉查找树对比结构图

平衡二叉树旋转的四种情况

  • 左左

    • 左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡

    • 如何旋转: 直接对整体进行右旋即可

左右

  • 左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡

  • 如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋

右右

  • 右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡

  • 如何旋转: 直接对整体进行左旋即可

右左

  • 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡

  • 如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋

4 红黑树

  • 红黑树的特点

    • 平衡二叉B树 特殊的二叉排序树

    • 每一个节点可以是红或者黑

    • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

  • 红黑树的红黑规则有哪些

    1. 每一个节点或是红色的,或者是黑色的

    2. 根节点必须是黑色

    3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

    4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)

    5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

  • 红黑树添加节点的默认颜色

    • 添加节点时,默认为红色,效率高

  • 红黑树添加节点后如何保持红黑规则

jdk源码:

    private void fixAfterInsertion(Entry<K,V> x) {x.color = RED;while (x != null && x != root && x.parent.color == RED) {if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {Entry<K,V> y = rightOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == rightOf(parentOf(x))) {x = parentOf(x);rotateLeft(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateRight(parentOf(parentOf(x)));}} else {Entry<K,V> y = leftOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == leftOf(parentOf(x))) {x = parentOf(x);rotateRight(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateLeft(parentOf(parentOf(x)));}}}root.color = BLACK;}

解析:

简单的理解

在有爷爷为根的情况:

左左情况

这种情况很简单,想象这是一根绳子,手提起 P 节点,然后变色即可

左右

左旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的左孩子,然后再应用 左左情况

右右

与左左情况一样,想象成一根绳子

右左

右旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的右孩子,然后再应用 右右情况

Java二叉树和红黑树相关推荐

  1. 一文搞懂JVM架构:java二叉树和红黑树

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  2. java 二叉树 红黑树_常见数据结构(二)-树(二叉树,红黑树,B树)

    常见数据结构(二)-树(二叉树,红黑树,B树) 标签: algorithms [TOC] 本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自course ...

  3. 真c++ 从二叉树到红黑树(6)之红黑树RedBlack

      此文章为从二叉树到红黑树系列文章的第六节,主要介绍介绍红黑树,相信,有了之前BST,AVL和B树的铺垫,你会很快地理解红黑树.但红黑树的情况也十分复杂,因此,推荐分两天来看红黑树.一天看插入,一天 ...

  4. 2022年3月28日记:Linux服务器开发,二叉树与红黑树

    ──────────────────────────────────── ┌------------┐ │▉▉♥♥♥♥♥♥♥♥ 99% │ ♥❤ 鱼沈雁杳天涯路,始信人间别离苦. └--------- ...

  5. 二叉树 平衡二叉树 红黑树_迅捷树,二叉树

    二叉树 平衡二叉树 红黑树 In this tutorial, we'll be discussing the Data Structure Trees and implement it using ...

  6. 【Mysql索引】二叉树、红黑树、B树、B+树

    [Mysql索引]二叉树.红黑树.B树.B+树 (1)哈希表 (2)二叉树的弊端的演示: (3)红黑树的插入演示: (4)B树的演示 (5)B+树的演示(叶子加指针:支持范围查找) (5.1)借着学习 ...

  7. MySQL索引数据结构二叉树、红黑树、B-Tree、B+Tree、Hash

    索引:帮助MySQL高效获取数据的有序的数据结构. 假设我们有一张表table,包含Clo1和Clo2两个字段 内存地址 Clo1 Clo2 0x07 1 36 0x5A 2 20 0x7A 3 80 ...

  8. 真c++ 从二叉树到红黑树(4)之二叉平衡搜索树AVL

      此文章为从二叉树到红黑树系列文章的第四节,主要介绍介绍二叉平衡搜索树AVL,当你理解了AVL,红黑树你就理解了一半了! 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.由BST引入 ...

  9. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST

      此文章为从二叉树到红黑树系列文章的第三节,主要介绍介绍二叉搜索树BST,为AVL和RedBlack打下基础 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.二叉搜索树BST的定义~ ...

最新文章

  1. 日志系统新贵Loki,确实比笨重的ELK轻
  2. Dollar Dayz poj3181
  3. UA OPTI570 量子力学2 物质波与物质粒子
  4. setsockopt()函数 参数详解
  5. 卷积网络的学习(卷积核,通道,padding,stride等概念)
  6. spring对事务的控制 AOP
  7. python 怎么调用 矩阵 第几行_第58集 python机器学习:混淆矩阵精度指标
  8. CentOS安装Oracle12C
  9. python爬虫基础扫盲之URL
  10. union的限制, 临时表大小的优化
  11. 用python做文件处理_用Python实现文件处理
  12. Ceph OSD处理客户端写操作处理流程
  13. 计算机1级b知识点,初中信息技术等级考试知识点
  14. ★如何解释特修斯之船问题? /编
  15. win10右键卡顿原因_如何解决Win10桌面右键一直卡顿转圈的问题?
  16. OWASP的s-sdlc项目优秀分享
  17. 对话旷视CEO印奇:一文看尽他创业九年的思考
  18. SAP 如何打Note
  19. 虫洞 Wormhole
  20. 知识点复习23 Mysql04

热门文章

  1. 手机网站设置几秒后强制跳转商务通
  2. 不同鸟的叫声Java编程_飞扬小鸟java版(3种版本一次下载)
  3. unicode 生僻字_基于Unicode编码技术的地名生僻字库研究
  4. 下载安装Tomcat
  5. 【力扣题解】面试题 10.11. 峰与谷
  6. 超详细一文到底!软件测试基本流程
  7. Pixie: A System for Recommending 3+ Billion Items to 200+ Million Users in Real-Time简介
  8. bootstrap的tooltip
  9. 网管好助手--PSTOOLS
  10. python plt legend并排_【Matplotlib】图例分开显示