获取树中节点的祖先

时间:2019-05-16 21:36:09

标签: javascript tree treeview

我的树看起来像这样。我需要获取给定节点的所有祖先。一个节点可以有多个子代,每个子代又可以是父代。

tree

我的代码看起来像这样,一直返回未定义状态。请告知。

  getAncestors(nodeId: number, ancestors: number[] = []): number[] {
    if (this.nodeId === nodeId) {
      return ancestors;
    }

    if (this.children.length > 0) {
      ancestors.push(this.nodeId);
    }

    for (const child of this.children) {
      child.getAncestors(nodeId,  ancestors);
    }

    return ancestors;
  }

1 个答案:

答案 0 :(得分:0)

只要阅读此行,就应该表明有严重的危险信号

child.getAncestors(nodeId,  ancestors);

如果每次有人问我所有的祖先是谁,我必须首先问我的孩子谁是他们的父母,充其量我的程序效率极低,最糟糕的是会遇到无限循环。我们完全不应在此函数中称呼孩子。

正确的解决方案将取决于此节点类的其余部分。例如,如果每个节点都可以访问根,则可以从根进行搜索,直到找到原始节点并跟踪我们沿途经过的所有节点。这可能会变得混乱。

一个更简单的解决方案是在创建每个节点时跟踪所有祖先。考虑文件系统的情况,其中访问任何文件都需要绝对路径。如果您预测自己将重新平衡并经常移动节点,则确实需要更新此祖先列表。

如果节点可以访问其父节点,则可以通过一个简单的while循环和一个指针来完成

ancestors = [];
nodePtr = this;
while (nodePtr !== root) {
    nodePtr = nodePtr.parent();
    ancestors.push(nodePtr);
}
nodePtr.push(root);