【发布时间】:2014-11-19 19:49:21
【问题描述】:
我有两棵 AVL 树,每棵树都按不同的参数对相同的数据进行排序(例如,其中一棵树实际上存储数据,另一棵树只是指向它)。在示例中,左边的树按左边的数字排序,右边的树按右边的数字排序:
58 64
/ \ / \
22 73 22 58
/ \ / \ / \ / \
19 36 64 81 81 73 36 19
假设我想删除一个项目(从两棵树中,因为它是相同的数据),但我只得到了左边的数字。例如,在调用removeLeft(6) 之后,我的树将如下所示:
58 36
/ \ / \
22 73 22 58
/ \ \ / \ \
19 36 81 81 73 19
我可以在 log(n) 时间找到左侧树中的节点,如果我在想要删除的节点处,我可以将它从每棵树的另一棵树中的另一棵树中删除它log(n)。
但是,我需要从左侧树中的节点到右侧节点的链接:
58 ------>64
/ \ | / \
22 73 | 22 58
/ \ / \ | / \ / \
19 36 64 81 | 81 73 36 19
|______|
否则我需要在n 时间找到右侧树中的节点,因为它不是按左侧数字排序的。
我的Tree 类不允许直接访问节点,只能访问数据(我希望保持这种状态)。
我是否别无选择,只能将我的数据结构实现为Tree 类的friend 类?那还能用吗?还是有一些优雅的方式来做这样的事情?
【问题讨论】:
-
只是为了澄清......这里涉及的其他数据类型是什么?
-
理想情况下,您会将指向这些数字对的指针放在树中,而不是数字本身。您将使用第一个数字作为排序标准制作第一棵树,使用第二个数字制作第二棵树。但是,由于您的“
Tree类不允许直接访问节点,只能访问数据”,因此您将不得不提出一些额外的数据结构来将树节点映射到树节点,例如std::unordered_map。
标签: c++ pointers tree encapsulation