AVL树,伸展树,B树的一些概念
来源:互联网 发布:java运行库安装 编辑:程序博客网 时间:2024/05/22 17:29
1,AVL树是带有平衡条件的二叉查找树,我们知道二叉查找树的定义是对于树中任意的节点X,它的左子树的所有项的值都小于X的值,它的右子树的所有项的值都大于X的值。
带有平衡条件的二叉查找树,是为了解决一个问题,什么问题呢?
问题是:当向一棵树输入预先排序好的数据时,二叉查找树所有节点都没有左儿子,这是对这棵树的操作的代价就会很大。
AVL树的平衡条件是:每个节点的左子树和右子树的高度最多差1。(空树的高度定义为-1)
在建造AVL树的时候,每插入一个节点判断树是否平衡,当树不满足平衡条件时,进行简单的修正。
两种修正方法:单旋转,双旋转。
1,单旋转:
对a的左儿子的左子树进行一次插入;对a的右儿子的右子树进行一次插入;使a的两颗子树的高度差为2;此时使用单旋转
2,双旋转:
对a的左儿子的右子树进行一次插入;对a的右儿子的左子树进行一次插入;使a的两颗子树的高度差为2;此时使用双旋转
AVL树删除节点:
a.当被删除节点n是叶子节点,直接删除。
b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置。
c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍历的前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。
删除之后还要考虑是否平衡,
2,伸展树保证从空树开始连续M次对树的操作最多话花费O(MlogN)时间,
解决的问题:因为要求O(logN)的摊还时间界,只要一个节点被访问,它就必须被移动,否则,一旦发现一个深层的节点,我们就有可能不断对它进行访问,如果这个节点部不移动,而每次右花费O(N),那么M次访问将花费O(M*N)的时间。
伸展树的基本思想:当一个节点被访问后,它就要经过一系列AVL树的旋转被推到根上。
方法1:执行单旋转
事实证明,对一个节点的访问会将另一个节点向深处推进,并没有改善访问路径上其他节点的状况。使用这个策略将会存在一系列M个操作共需要O(M*N)的时间,因此方法不够好。
方法2:展开
思路与上面的旋转相似,但在旋转如何实施上我们稍微有些选择的余地。我们仍然从底部向上沿着访问路径旋转。
情形:
1,之字形 使用AVL双旋转
2,一字形 使用一字形旋转
对一个节点访问之后,它总是处于其中一种情形,使用对应的方法展开,直到将节点推到根上。
3 ,B树(B-tree)本质上是一种针对外存储器设备设计的多路平衡查找树,该数据结构及其扩展结构(B+树,B*树等)被广泛应用于文件系统,数据库索引等。
平衡二叉查找树在:AVL树,伸展树,红黑树等等下一章讲红黑树。
带有平衡条件的二叉查找树,是为了解决一个问题,什么问题呢?
问题是:当向一棵树输入预先排序好的数据时,二叉查找树所有节点都没有左儿子,这是对这棵树的操作的代价就会很大。
AVL树的平衡条件是:每个节点的左子树和右子树的高度最多差1。(空树的高度定义为-1)
在建造AVL树的时候,每插入一个节点判断树是否平衡,当树不满足平衡条件时,进行简单的修正。
两种修正方法:单旋转,双旋转。
1,单旋转:
对a的左儿子的左子树进行一次插入;对a的右儿子的右子树进行一次插入;使a的两颗子树的高度差为2;此时使用单旋转
2,双旋转:
对a的左儿子的右子树进行一次插入;对a的右儿子的左子树进行一次插入;使a的两颗子树的高度差为2;此时使用双旋转
AVL树删除节点:
a.当被删除节点n是叶子节点,直接删除。
b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置。
c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍历的前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。
删除之后还要考虑是否平衡,
2,伸展树保证从空树开始连续M次对树的操作最多话花费O(MlogN)时间,
解决的问题:因为要求O(logN)的摊还时间界,只要一个节点被访问,它就必须被移动,否则,一旦发现一个深层的节点,我们就有可能不断对它进行访问,如果这个节点部不移动,而每次右花费O(N),那么M次访问将花费O(M*N)的时间。
伸展树的基本思想:当一个节点被访问后,它就要经过一系列AVL树的旋转被推到根上。
方法1:执行单旋转
事实证明,对一个节点的访问会将另一个节点向深处推进,并没有改善访问路径上其他节点的状况。使用这个策略将会存在一系列M个操作共需要O(M*N)的时间,因此方法不够好。
方法2:展开
思路与上面的旋转相似,但在旋转如何实施上我们稍微有些选择的余地。我们仍然从底部向上沿着访问路径旋转。
情形:
1,之字形 使用AVL双旋转
2,一字形 使用一字形旋转
对一个节点访问之后,它总是处于其中一种情形,使用对应的方法展开,直到将节点推到根上。
3 ,B树(B-tree)本质上是一种针对外存储器设备设计的多路平衡查找树,该数据结构及其扩展结构(B+树,B*树等)被广泛应用于文件系统,数据库索引等。
平衡二叉查找树在:AVL树,伸展树,红黑树等等下一章讲红黑树。
0 0
- AVL树,伸展树,B树的一些概念
- AVL树与伸展树入门
- 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
- 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
- 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
- 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
- 二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
- AVL树的一些实现
- 伸展树:双层伸展
- AVL树的一些事一些情
- AVL树、splay树(伸展树)和红黑树比较
- 红黑树、AVL树、B树的比较
- 伸展树的旋转和伸展操作
- 伸展树的点点滴滴
- 伸展树的点点滴滴
- 伸展树的点点滴滴
- 伸展树的读书笔记
- 伸展树的实现
- [HBase学习]HBase安装
- haproxy 基本维护命令和监控统计命令
- LeetCode 204 Count Primes题解
- java简单发邮件
- 解决grub问题
- AVL树,伸展树,B树的一些概念
- Urho3D简介
- opencv学习(十六)之颜色空间转换cvtColor()
- svn“Previous operation has not finished; run 'cleanup' if it was interrupted
- OpenGL(二十三) 各向异性纹理过滤
- laravel的修改器和访问器
- HDU2095find your present (2)
- 【C#】常用的字符串方法
- JPA 笔记