33 表、栈、队列、树


虽然表可以由数组创建,但数组是由固定容量创建的,插入和删除花费昂贵,最坏的情况是在0的位置,其后所有的元素都要向后移动,因为数组的空间是连续。

Java Collection API
collection接口包含size() isEmpty() contains() clear() remove() add() iterator() 它实现了Iterable接口
Iterable接口
实现iterator接口的集合必须提供一个称为iterator的方法,该方法返回一个iterator类型的对象。iterator接口的思路是,通过iterator方法,每个集合均可创建并返回给客户一个实现了iterator接口的对象,并将当前位置的概念在对象内部存储下来。

public interface Iterator<AnyType>{
boolean hasNext();
AnyType next();
void remove();
}

ArrayList: 底层基于动态数组,添加新元素前判断数组空间是否已满,满了先扩容两倍
LinkedList: 基于双链表,它的实现中会存放头节点和尾节点


栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。
栈有两种实现: 1使用单链表。2数组

队列
队列的数组实现
对于每一个队列数组,保留一个数组theArray以及位置front和back,他们代表队列的两端,记录元素个数的currentSize。是一个元素入队,则currentSize和back增1,然后置theArray[back]=x。若使元素出队,置返回值为theArray[front],currentSize和front加1。为了解决假满,当front或back到达数组末端时,又绕回开头,级使用循环数组。

树:
先序遍历:对节点的的处理是在诸儿子被处理之前进行
后序遍历:…之后…
二叉树:
先序遍历: 中左右
中序遍历:左中右
后序遍历:左右中

二叉查找树

在树中的每个节点X,它的左子树中所有项的值小于X的项,它的右子树中所有项的值大于X中的项。

删除
1.如果节点是一片树叶,则直接删除
2.如果节点有一个儿子,则其父节点的链直接指向其儿子
2.如果节点有两个儿子,删除策略是用其右子树的最小数据代替该节点的数据并递归的删除那个节点。(不了解 都可以看《数据结构与算法分析》119页)
4.如果删除次数不多,可以采用懒惰删除,当一个元素要被删除时,它仍留在树中只是标记为删除。
代码:

AVL树

AV树是每个节点的左子树和右子树的高度最多差1的二叉查找树。

当插入新节点后可能会破坏AVL树的特性,在插入完成前可以通过旋转来恢复平衡。
在插入后,从插入点到根节点的路径上节点的平衡可能被改变,沿着这条路径上行到根并跟新平衡信息时,可以发现一个节点它的新平衡破坏了AVL条件,我们叫这个节点a,有四种情况:
1.对a的左儿子的左子树进行了一次插入
2.对a的左儿子的右子树进行了一次插入
3.对a的右儿子的左子树进行了一次插入
4.对a的右儿子的右子树进行了一次插入
对于1.4情况可以通过单旋转,对于2.3通过双旋转
旋转方法,详见链接

伸展树

优秀博文:https://blog.csdn.net/canot/article/details/79968748
优秀博文:https://www.cnblogs.com/alantu2018/p/8464510.html
优秀博文:https://www.cnblogs.com/csushl/p/10122047.html

在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。

数据局部性:刚刚被访问过的元素,极有可能在不久之后再次被访问到
将被访问的下一元素,极有可能就处于不久之前被访问过的某个元素的附近
逐层伸展:每访问过一个节点之后,随即反复地以它的父节点为轴,经适当的旋转将其提升一层,直至最终成为树根。
双层伸展:每次都从当前节点v向上追溯两层(而不是仅一层),并根据其父亲p以及祖父g的相对位置,进行相应的旋转。
基本伸展树操作:
1、插入:
当一个节点插入时,伸展操作将执行。因此,新插入的节点在根上。
2、查找:
如果查找成功(找到),那么由于伸展操作,被查找的节点成为树的新根。
如果查找失败(没有),那么在查找遇到NULL之前的那个节点成为新的根。也就是,如果查找的节点在树中,那么,此时根上的节点就是距离这个节点最近的节点。
3、查找最大最小:
查找之后执行伸展。
4、删除最大最小:
a)删除最小:
首先执行查找最小的操作。
这时,要删除的节点就在根上。根据二叉查找树的特点,根没有左子节点。
使用根的右子结点作为新的根,删除旧的包含最小值的根。
b)删除最大:
首先执行查找最大的操作。
删除根,并把被删除的根的左子结点作为新的根。
5、删除:
将要删除的节点移至根。
删除根,剩下两个子树L(左子树)和R(右子树)。
使用DeleteMax查找L的最大节点,此时,L的根没有右子树。
使R成为L的根的右子树。

B树

全称Balance-tree(平衡多路查找树),父节点有多个子节点。
使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。这个数据结构一般用于数据库的索引,综合效率较高。
B-树的定义
1)树中的每个结点最多含有m个孩子;

2)除了根结点和叶子结点,其他结点至少有[ceil(m / 2)(代表是取上限的函数)]个孩子;

3)若根结点不是叶子结点时,则至少有两个孩子(除了没有孩子的根结点)

4)所有的叶子结点都出现在同一层中,叶子结点不包含任何关键字信息;
在这里插入图片描述
B树的查找。插入、删除,详见以下链接
B-树(B树)
在这里插入图片描述
B+树
详见链接
B+树可以说是B树的一种变形,它把数据都存储在叶结点,而内部结点只存关键字和孩子指针,因此简化了内部结点的分支因子,B+树遍历也更高效,其中B+树只需所有叶子节点串成链表这样就可以从头到尾遍历,其中内部结点是并不存储信息,而是存储叶子结点的最小值作为索引
在这里插入图片描述
B树与B树的比较

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值