performance - 有效地找到树节点的深度标记子节点

标签 performance algorithm tree computer-science children

给定一个(m-way)树 T:

        A
       / \
      B   C
     / \   \
    D*  E*  F
   / \   \   \
  G   H*  I   J*

对于标记的节点 D*、E* H* 和 J*,除了遍历所有子树或存储所有标记的 child 之外,是否有一种快速的方法来检索给定节点下的所有标记的子节点对于每个节点?即:

B -> D*, E*, H*
C -> J*
A -> D*, E*, H*, J*

最佳答案

原则上,您需要在遍历树和存储标记值列表之间进行权衡。您提到了两个极端,我将在下面给您举一个介于这两个极端之间的示例。

我想到的一个想法是在每个标记节点处存储下一个标记子节点的“层”,这应该在存储和时间之间提供相当平衡的组合,因此在您的示例中它不会节省太多,但是例如如果你有

        A
       / \
      B*  C
     / \   \
    D*  E   F
   / \   \   \
  G   H*  I*  J*
 /   / \
K   L   M

您可以将 D,I 存储在 B 中,将 H 存储在 D 中,并将“空”标记存储在 H,I,J.

要获取一个节点的列表,您只需要遍历直到每个分支都碰到一个标记的节点,例如,要获取 A 的列表,您必须从 遍历A->BA->C->F->J,然后 B 会给你 I,DD 会给你 H

您也可以将其视为仅将标记节点的树与原始树一起存储,在本例中为两棵树

  B        J
 / \
D   I
|
H

根据标记节点的分布,您可以针对您的应用程序优化此想法。

关于performance - 有效地找到树节点的深度标记子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458725/

相关文章:

java - 计算给定数字中连续幂的数字总和

database - 使用 "tree keys"在 Neo4j 中创建分层数据(树)结构

java 二维数组 - 排序和搜索

c# - 如何检测探查器是否正在运行?

java - 排序列表但不能直接比较两个模型

tree - 确定在 Google Apps 脚本树中选择了哪个 TreeItem

java - 井字游戏树

c# - 有没有办法提高我的简单文本过滤器的性能?

linux - Debug模式下速度极慢?

c++ - 转换和验证字符串