扩展这种树重写设计的最简洁方法是什么?

时间:2010-08-21 15:54:07

标签: c++ refactoring tree rewrite

我有一个对象树,每个对象都有一个指向其子节点的std::vector个指针。该对象的类具有rewrite()方法,该方法以递归方式应用于更改对象及其子对象,通常使用以下转换,其中[N]是要重写的对象,(M)rewrite()返回的元素:

                 (A)
 [A]             / \               [A]
 / \     -->    B   X               |    -->    (B)
B   C                \              B
                      C

扩展此设置以允许这样的转换的最简洁方法是什么?

    A             X
    |            / \
   [B]   -->    C   A
    |               |
    C              (Y)

即那些重新生成树,移动元素,插入新元素并返回插入元素的树。我很难想出一些不错的东西,也包含最少的重构。想法?

1 个答案:

答案 0 :(得分:1)

看起来,为了速度,您需要从每个子节点到其父节点的“后向指针”。这样你就可以按照指向任何节点的指针的父指针链一直到root,如果这就是你需要的东西(我不知道你是否计划在只给出一个指向内部节点的指针的情况下找到root的其他方法,没有backpointers?)。当然,每当你重新安排树时,你都需要调整后退指针以及“孩子”std::vector - 这是轻微重复信息的一个不幸后果(不过,比如,一个双重链表呈现;-),但这种双向导航的简易性和速度需要付出很小的代价。