前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构 之 树总结

数据结构 之 树总结

作者头像
菜的黑人牙膏
发布2019-01-21 16:17:35
5370
发布2019-01-21 16:17:35
举报
文章被收录于专栏:前端学习归纳总结

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树,是一种树形结构,是一种哈希树的变种

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档