簡體   English   中英

獲取樹中節點的祖先

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM