我有一个红黑树算法正常工作。将节点插入树中时,insert()方法会向调用方返回指向已插入节点的指针。我将所有这些指针存储在STL向量中。
问题是,在RB树的操作中,有时这些指针是无效的。例如,有一个在rotateleft / right期间调用的方法,它将节点A的值复制到当前节点,然后删除节点A.我在该向量中有一个指向节点A的指针现在无效。
我考虑过如何更新向量中的指针,
1)保留一个multimap,它将节点指针映射到包含这些指针的矢量索引。
2)在删除节点之前,请检查此多图以查找将受影响的向量中的所有点
3)迭代向量并将旧指针更改为新指针
4)更新多重映射中的键值以反映新指针。
问题是,由于显而易见的原因,您无法更新地图集合的键值。对于复杂性和实现原因,这似乎是一个可怕的解决方案。关于如何实现指针动态更新的任何想法?
答案 0 :(得分:0)
将数据保存在节点指向的某些不透明数据结构中,并保留指向此结构的外部指针而不是节点似乎更合理。
基本上,它意味着在树和实际数据之间添加一个间接级别。
答案 1 :(得分:0)
我不确定这是否正是您正在尝试做的事情,但为了跟踪添加到树/堆数据结构中的项目,以下对我有用:
除了基础树数据外,还存储两个“索引”向量:
std::vector<int> item_to_tree;
std::vector<int> tree_to_item;
因此,要在第i个项的树中查找索引,请使用item_to_tree[i]
。要在特定的第j个树索引处查找项目,请使用tree_to_item[j]
。这与存储显式指针类似,正如您所做的那样,但通过使用索引,您基本上可以获得具有O(1)查找的双向映射。
显然,在树操作中,您必须确保映射保持一致。我没有为RB树考虑这个问题,但是对于其他类似树的结构,这只会给每个操作增加一些O(1)复杂度。
如果从树中删除了第i个项目,tree_to_item
不再包含第i个项目索引,我通常会设置item_to_tree [i] = -1或一些“空”标志。 / p>
希望这有帮助。