我有一个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
如果是这样,我应该担心什么?如果没有,为什么不呢?
答案 0 :(得分:0)
如果您的新课程与您设想的所有基类之间存在“是”关系,则多重继承是一个不错的选择。
是树吗?
我想创建一个基本上是AVL树的类 增加了...的选项。
根据此声明,您的ListTree
最终是 Tree
并且应该从中继承。
是列表吗?
这取决于你List
背后的内容!如果它是一个纯虚拟类,它只定义了一个需要在具体列表类中派生的接口,那么是:从{ast>的角度来看,你的ListTree
是一个列表。
但是如果你的List
已经是一个具体的课程了 - 我在这里唠叨 - 那么答案应该是 NO 。为什么?列表是扁平的,而树则不是。树可以遍历像列表这样的事实不会使其成为列表。
如果您选择MI,则会继承Tree
和List
的内部数据。对于插入和移除等每个操作,您必须以一致的方式同步两个结构。例如,如果你只是将插入委托给两个基类,那么你将是O(n)而不是O(log(n))。
怎么办?
如果不知道如何管理容器元素,很难提供进一步的建议。
如何将List
成员添加到ListTree
类(组合而不是继承),并在树中存储引用/指向列表节点的指针?
对于遍历,您将使用O(1)中的列表。对于删除/插入,使用树来查找要在O(log(n))中插入或删除的节点,在列表节点上执行操作(假设列表是双重链接的),并且知道平衡是不影响列表中节点的顺序。