我应该使用多重继承来实现带链表的搜索树吗?

时间:2014-11-18 21:21:26

标签: c++ tree linked-list multiple-inheritance

我有一个List类和一个AVL Tree类,我想创建一个本质上是AVL树的类,其中添加了以升序遍历元素的选项:

            _5_
          _/   \_
         3       8
        / \     / \
       2   4   7   9

       2,3,4,5,7,8,9

关键是,我希望能够在O(log(n))时间插入/删除等,但我也想在4中从5转到O(1)时间。

我应该使用MI创建一个新类吗?

class ListTree: private List, public Tree

如果是这样,我应该担心什么?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:0)

如果您的新课程与您设想的所有基类之间存在“”关系,则多重继承是一个不错的选择。

是树吗?

  

我想创建一个基本上是AVL树的类   增加了...的选项。

根据此声明,您的ListTree最终 Tree并且应该从中继承。

是列表吗?

这取决于你List背后的内容!如果它是一个纯虚拟类,它只定义了一个需要在具体列表类中派生的接口,那么:从{ast>的角度来看,你的ListTree是一个列表。

但是如果你的List已经是一个具体的课程了 - 我在这里唠叨 - 那么答案应该是 NO 。为什么?列表是扁平的,而树则不是。树可以遍历列表这样的事实不会使其成为列表。

如果您选择MI,则会继承TreeList的内部数据。对于插入和移除等每个操作,您必须以一致的方式同步两个结构。例如,如果你只是将插入委托给两个基类,那么你将是O(n)而不是O(log(n))。

怎么办?

如果不知道如何管理容器元素,很难提供进一步的建议。

如何将List成员添加到ListTree类(组合而不是继承),并在树中存储引用/指向列表节点的指针?

对于遍历,您将使用O(1)中的列表。对于删除/插入,使用树来查找要在O(log(n))中插入或删除的节点,在列表节点上执行操作(假设列表是双重链接的),并且知道平衡是不影响列表中节点的顺序。