数据结构 之 树总结
Posted darlietoothpaste
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 之 树总结相关的知识,希望对你有一定的参考价值。
1.二叉树
特点:二叉树每个节点最多只有两个子节点, 分为左右子树, 且左子树 < 节点 < 右子树。
时间复杂度: O(logn), 存在中序、前序、后序遍历。
2.AVL树
特点:自平衡二叉树, 通过旋转来平衡二叉树的高度, 适用于查找多操作少的条件。
时间复杂度: 找、插入和删除在平均和最坏情况下都是O(log n)
3.红黑树
特点:自平衡二叉树, 通过着色、旋转来平衡二叉树
时间复杂度: 插入,删除,查找的复杂度都是O(log N)
1) 任何一个节点非红即黑;
2) 树的根为黑色;
3) 叶子节点为黑色(注意:红黑树的所有叶子节点都指的是Nil节点);
4) 任何两个父子节点不可能同时为红色;
5) 任何节点到其所有分枝叶子的简单路径上的黑节点个数相同;
红黑树的插入(插入元素为红色 参考:https://zhuanlan.zhihu.com/p/25358857):
1. 父节点是黑色, 直接插入。
2. 父节点是红色, 即祖父节点是黑色。
2.1.如果叔节点是红色, 即把祖父节点改成红色, 父节点和叔节点改为黑色, 同时当前指针指向祖父节点, 往上递归操作。
2.2.如果叔节点是黑色, 且当前插入节点是左儿子, 那么对祖父节点进行一次右旋转, 同时交换祖父和父节点的颜色。
2.3.如果叔节点是黑色, 且当前插入节点是右儿子, 对父节点进行一次左旋转, 指针指向父节点, 变成2.2情况。
红黑树的删除(参考:https://www.cnblogs.com/tongy0/p/5460623.html):
红黑树的删除相对复杂,找到被删除元素的后驱元素(前驱元素也可以),将找到的元素(D)复制到要删除的节点, 同时删除被找到的元素, 这时要进行操作来继续达到红黑树的特点。
1.如果D为红色, 直接删除。
2.如果D为黑色, 分别对DR(D的右儿子)是否为Nil判断
2.1.DR不为Nil, 则DR是红色,则删除D后, DR改为黑色即可。
2.2.DR为Nil, 则此时D这一边的树少了一个黑色节点, 那么必须借助S(D的兄弟节点)节点来帮助平衡, S又分为黑色和红色
2.2.1.S为黑色, 则可以分为四种情况处理。
2.2.1.1.S为黑色, SL(S的左儿子)为红色,对S进行一次右旋转, 将P染为黑色, 将SL染为原来P的颜色, 再对SL进行一次左旋转即可。
2.2.1.2.S为黑色,SR为红色, 将S由黑色改为P的颜色;将SR由红色改为黑色;将P的颜色改为黑色(用该黑色来填补DR分支缺失的黑节点数); 将P节点左旋转;
2.2.1.3.S为黑色,SLSR为黑色, P为红色,P与S交互颜色。
2.2.1.4.S为黑色,SLSR为黑色,P为黑色, 将S变成红色。
2.2.2.S为红色,即SLSR必定为黑色, 将P左旋转,再将P由黑色改为红色,将S由红色改为黑色, 这时DR的兄弟节点变为SL(黑色), 即可以跳到2.2.1继续处理。
4.B树
特点:
1)每个结点最多有m-1个关键字。
2)根结点最少可以只有1个关键字。
3)非根结点至少有Math.ceil(m/2)-1个关键字。
4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
应用于数据库索引, 读取磁盘速度太慢, 故使用B树更优。
B树的增加:
1)根据要插入的key的值,找到叶子结点并插入。
2)判断当前结点key的个数是否小于等于m-1,若满足则结束,否则进行第3步。
3)以结点中间的key为中心分裂成左右两部分,然后将这个中间的key插入到父结点中,这个key的左子树指向分裂后的左半部分,这个key的右子支指向分裂后的右半部分,然后将当前结点指向父结点,继续进行第3步。
B树的删除:
1)如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步
2)该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。
3)如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。
否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。
5.B+树
除叶子结点外, 其他结点只存放索引, 相对B树可以让树更加矮胖。 同时, B+树的结点都存放指针指向兄弟节点, 搜索更加快捷。
6.字典树
以上是关于数据结构 之 树总结的主要内容,如果未能解决你的问题,请参考以下文章