二叉查找树又称为二叉搜索树,或是BST
二叉查找树左节点小于根节点,右节点大于根节点;
二叉查找树比普通树查找更快,查找、插入、删除的时间复杂度为O(logN);
二叉查找树有一种极端的情况,就是会变成一种线性链表似的结构。此时时间复杂度就变成了O(N),为了解决这种情况,出现了平衡二叉树。
二、平衡二叉树平衡二叉树,又称为AVL树
左节点小于根节点,右节点大于根节点;
左子树和右子树的高度差不得超过1,这样保证了它不会成为线性的;链表
AVL树的查找稳定,查找、插入、删除的时间复杂度都为O(logN),但是由于要维持自身的平衡,所以进行插入和删除结点操作的时候,需要对结点进行频繁的旋转;
并且每个节点只有两个子节点。当进行查找时,就需要多次磁盘IO,(数据是存放在磁盘中的,每次查询是将磁盘中的一页数据加入内存,树的每一层节点存放在一页中,不同层数据存放在不同页)这样如果需要多层查询就需要多次磁盘IO。为了解决AVL树的这个问题,就出现了B 树。
三、红黑树红黑树是一种自平衡的二叉查找树,它的节点的颜色为红色和黑色。它不严格控制左、右子树高度或节点数之差小于等于1。通过左旋、右旋、变色保证平衡
1.每个节点非红即黑;
2.根节点总是黑色的;
3.每个叶子节点都是黑色;
4.红节点的子节点一定是黑色的。
5.从任一节点到叶子节点必须包含相同数量的黑色节点。
AVL树是高度平衡的而红黑树不是高度平衡的,它只要求部分地达到平衡要求,结合变色,降低了对旋转的要求从而提高了性能。在最坏的情况下也可以保证O(logN),二叉查找树最坏情况下O(N)。
四、B树B树也叫平衡树,也叫做B-树。是一种多路平衡树。
B树根结点至少有两个子女;
所有的叶子结点都位于同一层,每个结点的元素从小到大排列;
B树每一层存放了更多的节点,由AVL树的瘦高变成了矮胖。可以相对减少磁盘IO的次数,MongoDB的索引就是用B树实现的。
B树也是一种自平衡的树,在进行插入和删除操作时也需要对节点进行旋转操作。
五、B+树B+树每个非叶子节点存放的元素只用于索引作用,所有数据保存在叶子节点
1.每个中间节点不保存数据,只用来索引,所有数据都保存在叶子节点;
2.所有叶子节点中包含了全部元素的信息,叶子节点本身依关键字的大小顺序连接
3.为叶子节点增加一个链指针。
4.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
因为非叶子结点中存放的元素不存放数据,所以每一层可以容纳更多元素,也就是磁盘中的每一页可以存放更多元素。这样在查找时,磁盘IO的次数也会减少。
另外,B+树的查找稳定,因为所有的数据都在叶子结点。每个叶子结点也通过指针指向构成了一种链表结构,所以遍历数据也会简单很多。
插入删除操作会破坏平衡树的平衡性,因此在插入删除操作后,需要对树进行一个分裂、合并、旋转等操作来维护平衡性。
六、B+树与红黑树红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用B+ 树作为索引结构,主要有一下两个原因:
(1)更少的查找次数
平衡树查找操作的时间复杂度和树高h相关,O(h)=O(logN),其中d为每个结点的出度。
红黑树的出度为2,而B+树的出度一般都非常大,所以,红黑树的树高h很明显比B+树大非常多,查找次数也就更多。
(2)利用磁盘预读特性
参考