标签: avl-tree

平衡AVL树(C++)

我正在努力想弄清楚如何为我的班级平衡AVL树.我已经插入了这个:

Node* Tree::insert(int d)
{
    cout << "base insert\t" << d << endl;
    if (head == NULL)
        return (head = new Node(d));
    else
        return insert(head, d);
}

Node* Tree::insert(Node*& current, int d)
{
    cout << "insert\t" << d << endl;
    if (current == NULL)
        current = new Node(d);
    else if (d < current->data) {
        insert(current->lchild, d);
        if (height(current->lchild) - height(current->rchild)) {
            if (d < current->lchild->getData())
                rotateLeftOnce(current);
            else
                rotateLeftTwice(current);
        }
    }
    else if (d > current->getData()) {
        insert(current->rchild, d);
        if (height(current->rchild) …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm binary-tree avl-tree data-structures

20
推荐指数
2
解决办法
4万
查看次数

平衡二叉树(AVL)

好吧,这是CS领域的另一个理论领域.

在90年代,我在实施BST方面做得相当不错.我唯一无法理解的是算法的复杂性以平衡二叉树(AVL).

你能帮助我吗?

theory algorithm computer-science binary-tree avl-tree

14
推荐指数
2
解决办法
4万
查看次数

为什么要使用基于红黑树的Java TreeMap实现?

维基百科关于AVL树的文章的第三段说:"由于AVL树更加严格平衡,因此对于查找密集型应用程序来说,它们比红黑树更快."

因此,不应该使用AVL树而不是红黑树来实现TreeMap(因为基于散列的数据结构会有更多的查找密集型应用程序)?

java algorithm avl-tree red-black-tree binary-search-tree

11
推荐指数
1
解决办法
8461
查看次数

在给定多个节点的情况下,在AVL树中查找最小和最大高度?

在给定一定数量的节点的情况下,是否有公式来计算AVL树的最大和最小高度?

例如:
教科书问题:
3个节点,5个节点和7个节点的AVL树的最大/最小高度是多少?
教科书答案:
3个节点的AVL树的最大/最小高度为2/2,5个节点的最大/最小高度为3/3,7个节点的最大/最小高度为4/3

我不知道他们是否通过一些神奇的公式计算出来,或者他们是否为每个给定的高度绘制了AVL树并确定了它.

avl-tree binary-search-tree data-structures

11
推荐指数
2
解决办法
4万
查看次数

MongoDB中的自定义索引比较器

我正在使用由随机样本无法区分的概率加密元素组成的数据集.这样,相同数量的顺序加密导致不同的密文.然而,这些仍然可以通过应用SHA256等算法来比较两个密文的特殊函数进行比较.

我想将一个描述的密文列表添加到MongoDB数据库,并使用基于树的结构(即:AVL)对其进行索引.我不能简单地应用数据库的默认索引,因为如上所述,记录必须使用特殊函数进行比较.

示例:假设我有一个数据库db和一个由以下文档类型组成的集合c:

{
  "_id":ObjectId,
  "r":string
}
Run Code Online (Sandbox Code Playgroud)

另外,让F(int,string,string)成为以下函数:

F(h,l,r) = ( SHA256(l | r) + h ) % 3
Run Code Online (Sandbox Code Playgroud)

操作员在哪里 是标准的连接函数.

我想以有效的方式执行以下查询,例如在具有一些合适索引的集合中:

db.c.find( { F(h,l,r) :{ $eq: 0 } } )
Run Code Online (Sandbox Code Playgroud)

对于h和l任意选择但不是常数.即:假设我想找到满足F(h1,l1,r)的所有记录,对于某些对(h1,l1).后来,在另一个时刻,我想做同样的但是使用(h2,l2)使得h1!= h2和l1!= l2.h和l可以假设整数集合中的任何值.

我怎样才能做到这一点?

database indexing avl-tree mongodb

11
推荐指数
1
解决办法
727
查看次数

维基百科的不平衡AVL树的例子如何真正失衡?

替代文字

上面的图片来自"维基百科在AVL树上的条目",维基百科表示这是不平衡的.这棵树怎么还没有平衡?这是文章的引用:

节点的平衡因子是其右子树的高度减去其左子树的高度,并且具有平衡因子1,0或-1的节点被认为是平衡的.具有任何其他平衡因子的节点被视为不平衡,需要重新平衡树.平衡因子或者直接存储在每个节点上,或者从子树的高度计算出来.

左右子树的高度均为4.左侧树的右子树的高度为3,仍然只有1小于4.有人可以解释我缺少的东西吗?

binary-tree avl-tree data-structures

10
推荐指数
2
解决办法
6281
查看次数

为什么avl树比红黑树更快搜索?

我已经在几个地方阅读了它,可以更快地搜索树,但无法理解.据我了解:红黑树的最大高度= 2*log(N + 1)AVL树的高度= 1.44*标识(N + 1)

是因为AVL更短吗?

c++ atl avl-tree red-black-tree data-structures

10
推荐指数
2
解决办法
2520
查看次数

kd树总是平衡的吗?

我用过kd-tree algoritham并制作树.

但是我发现树不平衡所以我的问题是如果我们使用kd-tree algoritham那么树总是平衡的,如果没有那么我们怎样才能使它平衡?

我们可以使用另一个algoritham喜欢AVL或Red-Black来平衡kd树吗?

我有一些示例数据,我使用kd-tree algoritham,但树不平衡.

 (14,31), (15,32), (17,42), (16,44), (18,52), (16,62)
Run Code Online (Sandbox Code Playgroud)

algorithm avl-tree kdtree red-black-tree data-structures

10
推荐指数
2
解决办法
4418
查看次数

处理AVL树中的重复键

我想avl-tree支持重复键但是复制的默认行为存在问题,binary search tree即旋转可以使具有相同键的节点位于父级的左侧和右侧.

例如,当添加三个节点时,所有带有键A的节点将使树进行旋转,如下所示:

   A
  /  \ 
 A    A
Run Code Online (Sandbox Code Playgroud)

因此,使用该密钥获取所有条目将是一个问题......并且在两个方向上搜索都不是很好.

我想到的解决方案是让每个节点都存储一个重复数组,所以当添加一个已经存在的新项目时,只需要向数组添加一个新项目,删除带有键的项目将删除整个节点,同时查找所有项目使用key将返回该数组.

是否还有其他方法可以处理重复项?

插入项采用一个键和一个值..所以我需要存储值以便通过findAll使用某些键方法返回它们.

avl-tree

9
推荐指数
1
解决办法
8087
查看次数

找到AVL树中两个数字之间的最小间隙

我有一个数据结构作业,除了常规的AVL树函数,我还要添加一个函数,它返回AVL树中任意两个数字之间的最小间隙(AVL中的节点实际上代表数字.)

假设我们在AVL树中有数字(作为节点)1 5 12 20 23 21,该函数应该返回任意两个数字之间的最小间隙.在这种情况下它应该返回"1",即| 20-21 | 或| 21-20 |.

它应该在O(1)中完成.

试图思考很多,我知道有一个伎俩但是找不到它,我已经花了好几个小时.

还有另一项任务是找到最大间隙,这很容易,它是最小和最大数之间的差异.

tree search avl-tree data-structures

9
推荐指数
1
解决办法
3969
查看次数