[英]Get ancestors of a node in a 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;
}
剛剛閱讀此行應指示一個重大的紅色標志
child.getAncestors(nodeId, ancestors);
如果每次有人問我所有的祖先是誰,我必須首先問我的孩子,他們的父母是誰,充其量我的程序效率極低,最糟糕的是會遇到無限循環。 我們根本不應該在此函數中稱呼孩子。
正確的解決方案將取決於此節點類的其余部分。 例如,如果每個節點都可以訪問根,則可以從根進行搜索,直到找到原始節點並跟蹤我們沿途經過的所有節點。 這可能會變得混亂。
一個更簡單的解決方案是在創建每個節點時跟蹤所有祖先。 考慮文件系統的情況,其中訪問任何文件都需要絕對路徑。 如果您預測自己將重新平衡並經常移動節點,則確實需要更新此祖先列表。
如果節點可以訪問其父節點,則可以通過一個簡單的while循環和一個指針來完成
ancestors = [];
nodePtr = this;
while (nodePtr !== root) {
nodePtr = nodePtr.parent();
ancestors.push(nodePtr);
}
nodePtr.push(root);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.