本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。
第一层的为根节点,最后一层的都称为叶子节点,中间的都统称为节点
二叉树的图示例
如图中所示 A为根节点 ,#为叶子节点,其他的均称为树的节点。二叉树中比较常见的还有满二叉树和完全二叉树。
除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。如下图
除最后一层外,其它各层的结点数都达到最大个数,最后一层所有的结点都连续集中在最左边,这就是完全二叉树。如下图
满二叉树、完全二叉树、非完全二叉树的区别图解
二叉查找树定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2) 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
3) 左、右子树也分别为二叉排序树;
对二叉查找树进行中序遍历,即可得到有序的数列,二叉查找树的高度决定了二叉查找树的查找效率。
然而二叉查找树也会存在某些特殊情况,如下图所示(只存在左子树)
因此我们就需要平衡二叉树来提高二叉查找树的查找效率
平衡二叉树:
具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在平衡二叉搜索树中,大大降低了操作的时间复杂度。
平衡二叉树的常用算法有红黑树、AVL树。
AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis。
AVL树是带有平衡条件的二叉查找树,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转非常耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。
由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树。
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制的一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根是黑色。
性质3. 所有叶子都是黑色(叶子是NIL节点)。
性质4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
B树也是一种用于查找的平衡树,但是它不是二叉树。B树,概括来说是一个一般化的二叉查找树,可以拥有多于2个子节点。
B 树中的每个节点由两部分组成:
1. 关键字(可以理解为数据)
2. 指向孩子节点的指针
B树作为一种多路搜索树(并不是二叉的)M 阶的 B 树具有以下特征:
1) 根结点关键字至少为 1个,至多 M-1个;
2)指向子树的指针个数 = 关键字个数+1;
3)和 4)是关于除根节点和叶子节点外的节点的(即中间节点的关键字数和指向子树的指针数)
3) 中间节点至少2个关键字,至多 M-1个
4) 指向子树的指针个数 = 关键字个数+1;
5)是关于叶子节点的要求
5)所有叶子结点位于同一层;并且叶子节点只有关键字,指向孩子的指针为 null
6)是关于 所有节点的关键字
6) 每个节点左子树的数据比当前节点都小、右子树的数据都比当前节点的数据大
下图为 M=3 的 B 树:
B 树的创建示意图(M=4)
B+树的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;为所有叶子结点增加一个链指针;
B+的性质:
1.所有 value 值都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
B+树的优点在于;
1.由于B+树在非叶子结点上不包含真正的数据。只当做索引使用,因此在内存相同的情况下, 能够存放更多的key.
2.B+树的叶子结点都是相连的。因此对整棵树的遍历只需要一次线性遍历叶子结点即可。 而且由于数据顺序排列并且相连,所以便于区问查找和搜索。而B树则需要进行每一层的递归遍历。
B树的优点在于:
由于B树的每一个节点都包含key和value ,因此我们根据key直找value时。只需要找到key所在的位置就能找到value ,但B+树只有叶子结点存储数据,索引每一次查找 。都必须一次一次, -一直找到树的最大深度处,也就是叶子结点的深度,才能找到value,