我的树看起来像这样。我需要获取给定节点的所有祖先。一个节点可以有多个子代,每个子代又可以是父代。
我的代码看起来像这样,一直返回未定义状态。请告知。
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;
}
答案 0 :(得分:0)
只要阅读此行,就应该表明有严重的危险信号
child.getAncestors(nodeId, ancestors);
如果每次有人问我所有的祖先是谁,我必须首先问我的孩子谁是他们的父母,充其量我的程序效率极低,最糟糕的是会遇到无限循环。我们完全不应在此函数中称呼孩子。
正确的解决方案将取决于此节点类的其余部分。例如,如果每个节点都可以访问根,则可以从根进行搜索,直到找到原始节点并跟踪我们沿途经过的所有节点。这可能会变得混乱。
一个更简单的解决方案是在创建每个节点时跟踪所有祖先。考虑文件系统的情况,其中访问任何文件都需要绝对路径。如果您预测自己将重新平衡并经常移动节点,则确实需要更新此祖先列表。
如果节点可以访问其父节点,则可以通过一个简单的while循环和一个指针来完成
ancestors = [];
nodePtr = this;
while (nodePtr !== root) {
nodePtr = nodePtr.parent();
ancestors.push(nodePtr);
}
nodePtr.push(root);