二叉树 :有左右之分,次序不能颠倒


完全二叉树是一种效率很高的数据结构,二叉排序树要借助平衡性来实现,而平衡性基于完全二叉树。

二叉查找树

定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
  1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2) 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  3) 左、右子树也分别为二叉排序树;
  4) 没有键值相等的节点。
  二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。
  二叉查找树的时间复杂度:它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡(比如,我们查找上图(b)中的“93”,我们需要进行n次查找操作)。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷。
  二叉查找树的高度决定了二叉查找树的查找效率。

平衡二叉树 : 完全二叉树 -> 二叉搜索树 -> 左右子树的高度差的绝对值<=1

AVL树

自平衡二叉查找树 发明者, G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文中提出
AVL树的关键就是旋转, 重新设定根结点,把新根结点的左子树或者右子树移动到原来根结点的对应的右子树和左子树上

RB-tree红黑树

红黑树是牺牲了严格的高度平衡的优越条件为 代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高.

红黑树的性质
在满足二叉查找树的前提下
1 节点是红色或是黑色
2 根是黑色
3 所有叶子节点是黑色 (叶子是nil 节点)
4 每个红色节点必须有两个黑色节点(黑色的不一定有什么节点)这样就满足了从叶子节点
到根结点不可能有两个红色节点
5 从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点

这样从根到叶子的最长可能路径不多余最短可能路径的两倍,(这个树大致是平衡的,查找,插入,删除最坏时间情况和高度都是成正比的,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的)为什么会有这个结果,因为性质4 在路径上不能有两个相邻的红色节点,最短路径可能都是黑色节点,最长路径有交替的红色和黑色,如果有相同数目的黑色节点,所以就没有路径多余其他路径的两倍。

构造红黑树的误区
思维误区:把左右字数高度相差不能超过1加入到红黑树的性质中,这导致推理逻辑发生了错误。因为红黑树是用红黑着色来保证高度,直接用使用结果来推导红黑着色,这样会忽略红黑树本身的优点,而只关注了平衡二叉树的优点。错误思维路线:先优先保持二叉搜索树的性质,然后通过旋转使其保持平衡,然后再进行颜色调整。感觉只是在探讨平衡二叉搜索树的性质,红黑性质被弱化了,仅仅是为了构造一个红黑树而调整着色。思维调整:先从二叉搜索树的角度对节点进行插入,然后从着色的角度对树进行旋转。

B树

B树,概括来说是一个一般化的二叉查找树,可以拥有多于2个子节点。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。这种数据结构常被应用在数据库和文件系统的实作上。
B树作为一种多路搜索树 与平衡二叉树区别是节点的数据结构不同 类似于2-3-4树

  1. 定义任意非叶子结点最多只有M个儿子;且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M];
  4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
  5. 非叶子结点的关键字个数=指向儿子的指针个数-1;

B+树

为所有叶子结点增加一个链指针;
所有关键字都在叶子结点出现;
更适合文件索引系统。

B*树

B+树只有叶子节点增加了指向兄弟节点的指针
B树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3。
B
树分配新结点的概率比B+树要低,空间使用率更高

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针

原文出处:http://www.cnblogs.com/maybe2030/p/4732377.html#_label5

你可能感兴趣的:(树)