码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 之 树总结

时间:2018-08-04 19:05:11      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:排列   html   注意   ref   部分   操作   必须   复制   结构   

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.字典树

        单词查找树,Trie树,是一种树形结构,是一种哈希树的变种

数据结构 之 树总结

标签:排列   html   注意   ref   部分   操作   必须   复制   结构   

原文地址:https://www.cnblogs.com/Darlietoothpaste/p/9419227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!