一个AVL树与重复的价值观和双比较

0

的问题

我需要建立一个数据结构(主要使用AVL树)的对象有两个价值:一级(不是唯一的)和身份(是独特的).

我需要支持搜索的id,通过印刷订的等级,以及合并两个这样的树木和维持这些功能,与新树。

我已经有几种解决方案的想法,但我想问问关于一个特定的一:

将它的工作来实现这种结构中与一个单AVL树里的两个节点是第一个相比,根据他们的级别,然后他们id? 主要是我的斗争,认识到如何合并两个这样的树可以工作,特别是在这种情况下,我们有树在哪里的所有对象都是平x和树B所在的所有对象的水平。

编辑:也用于搜索id此外还会有一棵树,只按标识。

可以这种方法的工作?

algorithm avl-tree data-structures
2021-11-23 19:10:15
1

最好的答案

2

奇异AVL树里的两个节点是第一个相比,根据他们的级别,然后他们id?

不幸的是没有。 如果你这样做你将不能够有效率地找到一个节点由其id-你需要来看,通过所有可能的"水平",你没有指定,所以我假定他们可以无界。

我认为您可能想要插入每个节点成两个单独的AVL树木代替。 一个AVL树将以节点的水平,通过他们的身份证。 所有查询,插入、缺失和合并可以在每棵树的分开。

换句话说你会创造两个索引过你的数据。

在代码:

struct Node {
    int id;
    int level;

    // by id
    int id_bf;
    Node *id_left, *id_right;

    // by level
    int level_bf;
    Node *level_left, *level_right;
};

编辑:也用于搜索id此外还会有一棵树,只按标识。

那么你基本上描述了同样的事情,因为我。 但是你的树就是按复合 (level, id) 关键是浪费;所有你需要的是一棵树排 (level) 和一棵树排 (id) (标键)。 有没有需要,在业务你提供的,排序 (level, id)(id).

2021-11-23 19:29:44

谢谢你的回复,不幸的是,我只是忘了提及,此外我将有一个树按id这一功能。 我以为你解决我只是想知道关于这个特殊的解决方案的一个同学告诉我我觉得不会的工作,因为合并,
user3917631

@user3917631:树根据(水平,id)也是根据(水平)。 因此如果你有一个树根据(id)除了这些,你就可以做到行动有效地就像我所描述的。 这是一个有点浪费的排序由(水平,id)如果所有你需要的是(水平)。
Yakov Galka

我知道,我只问出来的兴趣,它能工作? 是否有可能有两棵树根据(水平,id)两个整数和它们合并在O(n)(n号的合并的节点)。
user3917631

@user3917631:是的这是可能的,并无不同,从合并两个的树木按其他任何东西。 二进制的搜索树木是比较的基础,因此他们不关心你是什么使用你的钥匙,只要它是一个 完全有序. 一组整数是来设定的。 维基百科上的文章AVL树介绍了如何执行有效合并; 还有这就是所谓的联盟. 但是你可能需要存储节点高度,而不是一个平衡因素,做到这一点。
Yakov Galka

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................