如何在无序树中快速查找节点

时间:2015-11-27 00:34:25

标签: algorithm tree-traversal

我有一个无序的树形式,例如:

Root
    A1
        A1_1
            A1_1_1
            A1_1_2
                    A1_1_2_1
                    A1_1_2_2
                    A1_1_2_3
            A1_1_3
            A1_1_n
        A1_2
        A1_3
        A1_n
    A2
        A2_1
        A2_2
        A2_3
        A2_n
  • 树无序
  • 每个孩子可以随机计算N个孩子
  • 每个节点都存储一个唯一的长值。
  • 所需的值可以在任何位置。

我的问题:如果我需要 A1_1_2_3 的长值,我第一次遍历节点时我会深入搜索得到它,但是:在以后调用同一个节点我必须得到没有递归搜索的价值。为什么?如果这棵树在到达我的A1_1_2_3节点之前会有数十万个节点,则需要花费太多时间。 我想到的是,在第一次遍历后留下一些指针。例如。对于我的情况,当我给出A1_1_2_3的长值时,我还会给出一个数组,其中包含将来搜索同一节点的信息,并说:要获得A1_1_2_3,我需要:

  • Root的第一个孩子,即A1
  • A1的第一个孩子,即A1_1
  • A1_1的第二个孩子,即A1_1_2
  • A1_1_2的第三个孩子,这就是我需要的:A1_1_2_3

所以我想我会将这些信息与A1_1_2_3的值一起存储为索引数组:[0,0,1,2]。通过这样做,我可以在后续调用A1_1_2_3时轻松地重新创建节点,并且每次都避免递归。

然而节点可以改变。在后续调用中,我可能有一个新结构,因此我之前存储的索引将不再匹配。但是,如果发生这种情况,我想,每当我不再找到该元素时,我会递归地返回一个级别并搜索该项目,依此类推,直到我再次找到它并再次存储索引以供将来引用:

e.g。如果我的A1_1_2_3现在位于这个新结构中:

    A1_1
        A1_1_0
        A1_1_1
        A1_1_2
                A1_1_2_1
                A1_1_2_2
                A1_1_21_22
                A1_1_2_3

...在这种情况下,新元素A1_1_0破坏了我的存储结构,所以我会回到一个级别并再次递归搜索子项,直到我再次找到它。

这是否有意义,我在这里想到的,还是我过于复杂的事情?我在谈论一个无序的树,它最多可以有三十万个节点,而且我能尽可能快地跳到节点是至关重要的。但树也可以很小,在10个节点之下。

在这种情况下,是否有更有效的搜索方式?

谢谢你的任何想法。

编辑:

我忘了添加:我在后续调用中需要的不仅仅是相同的值,而且它的位置也很重要,因为我必须在该子节点之后获得子页面的下一页(因为它是一个树结构,我调用了分页在最初选择的节点之后的节点上)。希望现在更有意义。

0 个答案:

没有答案