当前位置: 首页 > news >正文

二叉排序树BST(二叉查找树) 二叉平衡树AVL 红黑树

动态查找树主要包括:二叉查找树,平衡二叉树,红黑树,B树,B-树,查找的时间复杂度就为O(log2N),通过对数就可以发现降低树的深度就会提高查找效率

 

需要的应用场景

大量的数据会存储到外存磁盘,外存磁盘中读取与写入某数据的时候,首先定位到磁盘中的某一块,所以我们就需要一种高效的数据结构来有效的查找磁盘中的数据

 

二叉排序树BST

二叉排序树,也称二叉查找树

 

  • 若左子树非空,则左子树上所有节点值均小于根节点
  • 若右子树非空,则右子树上所有节点值均大于根节点
  • 左、右子树本身也分别是一颗二叉搜索树

 

 

平衡二叉树(平衡树)

        为避免树的高度增长过快,降低二叉排序树的性能,我们规定在插入和删除二叉树结点时,要保证任意节点的左右子树高度差的绝对值不超过1,将这样的二叉树成为平衡二叉树

 

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL), 两个是一回事,AVL是发明者的首字母

也叫二叉平衡查找树 或 二叉平衡搜索树

平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构

平衡二叉树是一种特殊的二叉排序树

 

插入节点后若导致树不平衡会调整节点

 

 

AVL树平衡调整

  • LL平衡旋转(右单旋转)
  • RR平衡旋转(左单旋转)
  • LR平衡旋转(先左后右双旋转)
  • RL平衡旋转(先右后左双旋转)
  •  

 

 

红黑树

红黑树,Red-Black Tree ,RBT

当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。

 

       平衡二叉树保证了在最差的情况下,二叉树依然能够保持绝对的平衡,即左右两个子树的高度差的绝对值不超过1。但是这又会带来一个问题,那就是平衡二叉树的定义过于严格,导致每次插入或者删除一个元素之后,都要去维护二叉树整体的平衡,这样产生额外的代价又太大了。二叉搜索树可能退化成链表,而平衡二叉树维护平衡的代价开销又太大了,那怎么办呢?这就要谈到“中庸之道”的智慧了。说白了就是把平衡的定义适当放宽,不那么严格,这样二叉树既不会退化成链表,维护平衡的开销也可以接受。没错,这就是我们要谈的红黑树了。

 

红黑树是一种自平衡的二叉查找树,含有红黑节点

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。
  • 性质4:每个红色结点的两个子结点一定都是黑色。没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点

 

红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡

 

前面讲到红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色。

  • 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图3。
  • 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图4。
  • 变色:结点的颜色由红变黑或由黑变红。


 

平衡二叉树到红黑树的演变

https://zhuanlan.zhihu.com/p/103306156

 

相关文章:

  • B树 B+树
  • Node-Red(一)——简介与安装
  • 数据挖掘与数据分析(四)—— 预处理理论(1) —— 特征工程 Feature Engineering
  • representation learning 表示学习/表征学习
  • Darknet 轻量级深度学习训练框架
  • cfg文件
  • 双向循环神经网络(BiRNN)MNIST手写体识别(tensorflow)
  • 双向循环神经网络(BiRNN)
  • MIPS
  • FPGA
  • Verilog硬件描述语言
  • SLAM
  • 深度估计(Depth Estimation)
  • 视觉里程计Visual Odometry(VO)
  • LiDar 激光雷达
  • Google 是如何开发 Web 框架的
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Docker 笔记(2):Dockerfile
  • ECMAScript6(0):ES6简明参考手册
  • golang中接口赋值与方法集
  • Hibernate最全面试题
  • leetcode386. Lexicographical Numbers
  • mysql外键的使用
  • Next.js之基础概念(二)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python学习之路16-使用API
  • redis学习笔记(三):列表、集合、有序集合
  • SwizzleMethod 黑魔法
  • Theano - 导数
  • 浮现式设计
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 手写一个CommonJS打包工具(一)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​linux启动进程的方式
  • ​比特币大跌的 2 个原因
  • ​学习一下,什么是预包装食品?​
  • (02)Hive SQL编译成MapReduce任务的过程
  • (02)vite环境变量配置
  • (09)Hive——CTE 公共表达式
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (pojstep1.3.1)1017(构造法模拟)
  • (二)springcloud实战之config配置中心
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (简单) HDU 2612 Find a way,BFS。
  • (转)mysql使用Navicat 导出和导入数据库
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET6实现破解Modbus poll点表配置文件
  • 。Net下Windows服务程序开发疑惑
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ;号自动换行
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 第一章] JavaScript 简史
  • [20190416]完善shared latch测试脚本2.txt