首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >AVL树:如何进行索引访问?

AVL树:如何进行索引访问?
EN

Stack Overflow用户
提问于 2012-06-08 20:59:17
回答 1查看 4.7K关注 0票数 6

我在AVL Tree Wikipedia page上注意到了下面的评论:

如果每个节点另外记录其子树(包括其自身及其后代)的大小,则也可以在O(log n)时间内通过索引检索节点。

我在谷歌上搜索了一下,找到了一些提到accessing by index的地方,但似乎找不到一个人会写的算法的解释。

非常感谢

更新,谢谢大家。如果找到@templatetypedef答案,结合其中的@user448810 links来特别帮助。尤其是下面这段代码:

“这两个函数的关键是,节点的索引是它的左子节点的大小。只要我们通过树的左子节点向下移动,我们就只获取节点的索引。但当我们必须通过它的右子节点向下移动树时,我们必须调整大小,以包括我们已排除的树的一半。”

因为我的实现是不可变的,所以在重新平衡时我不需要做任何额外的工作,因为每个节点都会在构造时计算它的大小(与impl链接的方案相同)

我的最终实现是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Node<K,V> implements AVLTree<K,V> { ...
    public V index(int i) {
        if (left.size() == i) return value;
        if (i < left.size()) return left.index(i);
        return right.index(i - left.size() - 1);
    }
}

class Empty<K,V> implements AVLTree<K,V> { ...
    public V index(int i) { throw new IndexOutOfBoundsException();}
}

这与其他实现略有不同,如果您认为我有bug,请让我知道!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-08 21:04:35

这种构造背后的一般思想是采用现有的BST,并通过存储左子树中的节点数量来增加每个节点。完成此操作后,您可以使用以下递归算法查找树中的第n个节点:

  • 若要查找其根节点在左子树中具有k个元素的BST中的第n个元素,请执行以下操作:
    • 如果k= n,则返回根节点(因为这是树中的第0个节点)
    • 如果n≤k,则递归查找左侧的第n个元素在右侧BST中查找(n -k- 1)st元素

这需要时间O(h),其中h是树的高度。在AVL树中,这是O(log )。在CLRS中,这种结构被探索应用于红/黑树,他们将这种树称为“顺序统计树”。

您必须在树旋转期间添加一些额外的逻辑,以调整左子树中缓存的元素数量,但这并不是特别困难。

希望这能有所帮助!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10955972

复制
相关文章
AVL树
平衡二叉树,是一个方便查找的树,树的左子树深度与右子树的深度的差总(BF)是在+1,0,-1之中。 随着树的建立,插入,树都会自动的进行调整,使得其满足上面的条件。 1、+1表示左子树的深度比右子树的深度多1. 2、0 表示左子树的深度与右子树的深度相同。 3、-1表示左子树的深度比右子树神的小1. 因此,如果一个数据插入到情况1中,也就是说,数据插入到左子树中,左子树的深度将会比右子树多2.此时,需要调整树的结构。如果插入尾端节点的左子树中,则这个尾端节点相应的BF值,就变成+1.相反,如果插入到它的右子
用户1154259
2018/01/17
8160
AVL树
AVL树
详细描述,好像跟我自己写的差不多......不过终究是大神级别,讲的就是透彻 1. 概述 AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 2. 基本术语 有四种种情况可能导致二叉查找树不平衡,分别为: (1)LL:插入一个新节点到根节点的
用户1154259
2018/01/17
7900
AVL树
AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,导致其效率低下。
DioxideCN
2022/08/05
3770
AVL树
AVL树
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83059431
zy010101
2019/05/25
4640
AVL树—-java
AVL树—-java
全栈程序员站长
2022/07/13
7250
AVL树—-java
手写AVL 树
平衡二叉树 左旋,右旋,左右旋,右左旋 具体原理就不说了,网上教程很多。这里只实现了建树的过程,没有实现删除节点的操作。 下一篇会实现删除节点的操作。 // // main.cpp // AVL // // Created by 小康 on 2019/3/30. // Copyright © 2019 小康. All rights reserved. // #include <iostream> #include <stdio.h> #include <stdlib.h> #include <mat
ShenduCC
2019/04/01
4990
C++【AVL树】
普通的二叉搜索树可能会退化为单支树(歪脖子树),导致搜索性能严重下降,为了解决这个问题,诞生了平衡二叉搜索树,主要是通过某些规则判断后,降低二叉树的高度,从而避免退化,本文介绍的 AVL 树就属于其中一种比较经典的平衡二叉搜索树,它是通过 平衡因子 的方式来降低二叉树高度的,具体怎么操作,可以接着往下看
北 海
2023/07/01
1510
C++【AVL树】
AVL树探秘
一、AVL树   AVL树是一种平衡查找树,在前面的两篇文章:二叉搜索树 和 红黑树 中都提到过。由于二叉搜索树在某些特殊情况下是不平衡的(任意一个结点深度过大),因此其一些动态集合操作在最坏情况下的时间复杂度为O(n)。因此提出一些对二叉搜索树效率改进的树结构使最坏时间复杂度降为O(lgn),AVL树和红黑树就是其中的代表,除此之外,还有一些如AA-tree、B-tree、2-3-tree等。使不平衡树变平衡最关键的是找到“平衡条件”,我们已经在前面一篇文章中详述了红黑树的平衡条件是:对节点进行着色,并约
Linux云计算网络
2018/01/11
9660
【C++】AVL树
二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查
青衫哥
2023/03/31
3100
【C++】AVL树
AVL树(Java语言)
平衡二叉树也叫平衡二叉查找树,又被称为AVL树,可以保证查询效率较高。它的特点是:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 结点的平衡因子定义为:结点的左子树高度与右子树高度之差。显然,对一棵AVL树而言,其所有结点的平衡因子只能是-1,0,1.挡在一棵AVL树上插入一个结点时,有可能导致失衡,即出现绝对值大于1的平衡因子。
技术交流
2022/11/18
4210
AVL树(Java语言)
C++AVL树
AVL树 零、前言 一、AVL树的概念 二、AVL树结点定义 三、AVL树的插入 四、AVL树的旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 5、总结 五、AVL树的验证 六、AVL树的性能 零、前言 本章主要讲解map和set的底层结构平衡二叉搜索树的一种-AVL树的特性及其实现 一、AVL树的概念 引入: map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷 假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化
用户9645905
2022/11/30
4320
C++AVL树
AVL二叉树AVL二叉查找树
AVL二叉查找树 AVL二叉查找树是一种特殊的二叉查找树,其规定 每个节点的左子树和右子树的高度差最多是1 AVL调整算法 AVL树插入一个新的节点到某个节点下破坏AVL树的要求时,对于破坏条件的第一个节点a(最靠近底部/深度最深的节点),具有四种情况: 插入a的左儿子节点的左子树 插入a的左儿子节点的右子树 插入a的右儿子节点的左子树 插入a的右儿子节点的右子树 其中,第一种和第四种可以看成一种情况的镜像,均是插入外侧;第二种和第三种可以看成另一种情况的镜像,均是插入内侧。这两种情况分别对应两种不同
月见樽
2018/04/27
6440
AVL二叉树AVL二叉查找树
C++:AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下,时间复杂度为O(N);
二肥是只大懒蓝猫
2023/03/30
3840
C++:AVL树
手写AVL 树(下)
上一篇 手写AVL树上实现了AVL树的插入和查询 上代码: 头文件:AVL.h #include <iostream> template<typename T1,typename T2> struct Tree { Tree* leftChild; Tree* rightChild; Tree* father; T1 key; T2 value; int leftHeight; int rightHeight; }; template<t
ShenduCC
2019/04/18
4990
C++——AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。 因此,两位苏联的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。
有礼貌的灰绅士
2023/04/27
2510
C++——AVL树
动画 | 什么是AVL树?
首先介绍下 二分搜索树 ,它又名有序二叉查找树,它的特点是左子树的节点值要小于父节点值,右子树的节点值要大于父节点值。基于这样的特点,我们在查找某个节点的时候,可以采取二分查找的思想快速找到这个节点,时间复杂度期望值是为O(log n),但是它有最坏的的情况下。
我脱下短袖
2020/01/02
8670
04-树4. Root of AVL Tree-平衡查找树AVL树的实现
  对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率。一种解决办法就是要有一个称为平衡的附加的结构条件:任何节点的深度均不得过深。有一种最古老的平衡查找树,即AVL树。   AVL树是带有平衡条件的二叉查找树。平衡条件是每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1)。相比于普通的二叉树,AVL树的节点需要增加一个变量保存节点高度。AVL树的节点声明如下: typedef stru
llhthinker
2018/01/24
9560
TypeScript实现AVL树与红黑树
二叉搜索树存在一个问题: 当往树中插入的数据一大部分大于某个节点或小于某个节点,这样就会导致树的一条边非常深。为了解决这个问题就出现了自平衡树这种解决方案。
神奇的程序员
2022/04/10
5310
TypeScript实现AVL树与红黑树
C++之AVL树
前面我们介绍了STL中的关联式容器map/set/multimap/mutiset等,我们可以发现它们的底层都是按照二叉搜索树来实现的,但是二叉搜索树自身有一些缺陷,当往二叉搜索树中插入的元素有序或者接近有序二叉搜索树就会退化为单支,其检索的时间复杂度就会退化为O(n)。因此map、set等关联式容器的底层结构是对搜索二叉树进行平衡处理的平衡二叉搜索树。 本节我们就来了解平衡搜索二叉树AVL树的相关概念。
摘星
2023/04/28
8240
C++之AVL树
点击加载更多

相似问题

用AVL树进行哈希

25

如何在AVL树中进行插入操作?

13

如何增强AVL树?

12

AVL树如何平衡插入树

11

如何旋转树或AVL树?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文