二叉搜索树、AVL树、红黑树、B+树、B-树

二叉搜索树:

简介

二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:

  • 任意节点左子树不为空,则左子树的值均小于根节点的值.
  • 任意节点右子树不为空,则右子树的值均大于于根节点的值.
  • 任意节点的左右子树也分别是二叉查找树.
  • 没有键值相等的节点.

由于其在某些情况下会退化为一个线性链表,时间复杂度变成链表形式O(n)
在这里插入图片描述
由此产生了AVL树和红黑树

AVL树

简介

AVL树是带有平衡条件的二叉搜索树,一般用平衡因子判断是否需要旋转来实现平衡

  • 是二叉搜索树
  • 左右子树高度不超过1

是严格的平衡二叉树,适合与查找相对较多的场景,插入和删除次数较少的。
应用:Windows NT内核中广泛存在
在这里插入图片描述

红黑树

简介

  • 是一种二叉搜索树
  • 每个节点非红即黑
  • 根节点是黑色的,叶子节点也是黑色的
  • 如果一个节点是红色的,那么他的两个儿子都是黑色的
  • 对于任一节点,其到叶子节点的每条路径都包含相同数目的黑节点
    在这里插入图片描述

应用:

  1. 广泛应用于C++中的STL,包括map和set
  2. 应用于linux的进程调度,用红黑树管理进程控制块,进程的虚拟内存区域都存储着一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指正指向相邻的高地址虚拟空间地址
  3. IO多路复用epoll采用了红黑树组织管理sockfd,以支持快速的增删改查
  4. nginx中用红黑树管理timer,因为红黑树是有序的,所以可以很快得到距离当前最小的定时器
  5. java中的TreeMap实现

B树

简介:

  1. 定义任意非叶子结点最多只有M个儿子;且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M];
  4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
  5. 非叶子结点的关键字个数=指向儿子的指针个数-1;
  6. 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  7. 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
  8. 所有叶子结点位于同一层;
    在这里插入图片描述

B+树

简介:

  1. 非叶子节点的子树指针与关键字个数相同;
  2. 非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复);
  3. 为所有叶子节点增加一个链指针
  4. 所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);
  5. 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层.
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值