二叉搜索树:
简介
二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:
- 任意节点左子树不为空,则左子树的值均小于根节点的值.
- 任意节点右子树不为空,则右子树的值均大于于根节点的值.
- 任意节点的左右子树也分别是二叉查找树.
- 没有键值相等的节点.
由于其在某些情况下会退化为一个线性链表,时间复杂度变成链表形式O(n)
由此产生了AVL树和红黑树
AVL树
简介
AVL树是带有平衡条件的二叉搜索树,一般用平衡因子判断是否需要旋转来实现平衡
- 是二叉搜索树
- 左右子树高度不超过1
是严格的平衡二叉树,适合与查找相对较多的场景,插入和删除次数较少的。
应用:Windows NT内核中广泛存在
红黑树
简介
- 是一种二叉搜索树
- 每个节点非红即黑
- 根节点是黑色的,叶子节点也是黑色的
- 如果一个节点是红色的,那么他的两个儿子都是黑色的
- 对于任一节点,其到叶子节点的每条路径都包含相同数目的黑节点
应用:
- 广泛应用于C++中的STL,包括map和set
- 应用于linux的进程调度,用红黑树管理进程控制块,进程的虚拟内存区域都存储着一颗红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指正指向相邻的高地址虚拟空间地址
- IO多路复用epoll采用了红黑树组织管理sockfd,以支持快速的增删改查
- nginx中用红黑树管理timer,因为红黑树是有序的,所以可以很快得到距离当前最小的定时器
- java中的TreeMap实现
B树
简介:
- 定义任意非叶子结点最多只有M个儿子;且M>2;
- 根结点的儿子数为[2, M];
- 除根结点以外的非叶子结点的儿子数为[M/2, M];
- 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
- 非叶子结点的关键字个数=指向儿子的指针个数-1;
- 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
- 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
- 所有叶子结点位于同一层;
B+树
简介:
- 非叶子节点的子树指针与关键字个数相同;
- 非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复);
- 为所有叶子节点增加一个链指针
- 所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);
- 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层.