有没有办法在树中找到路径?

Is there a way to find a path in a tree?

假设我们有一棵如下图所示的树。是否有一种算法可以给定 2 个节点找到连接它们的路径。例如,给定 (A,E) 它将 return [A,B,E],或者给定 (D,G) 它将 return [D,B,A,C,G]

           A
         /   \
       B       C
      / \     / \
     D   E   F   G

您将需要一个树实现,其中子节点与其父节点有 link。

然后对于两个节点,您可以构建从节点到根的路径,只需跟随父节点 link。

然后比较两条路径,从路径的末端(根所在的位置)开始:只要它们相同,就从两条路径中删除那个公共节点。

最后给你留下两条岔路。反转第二个,加入两条路径,将最后删除的节点放在两者之间。

这是 JavaScript 中的一个实现:

function getPathToRoot(a) {
    if (a.parent == null) return [a];
    return [a].concat(getPathToRoot(a.parent));
}

function findPath(a, b) {
    let p = getPathToRoot(a);
    let q = getPathToRoot(b);
    let common = null;
    while (p.length > 0 && q.length > 0 && p[p.length-1] == q[q.length-1]) {
        common = p.pop();
        q.pop();
    }
    return p.concat(common, q.reverse());
}

// Create the example tree
let nodes = {};
for (let label of "ABCDEFG") {
    nodes[label] = { label: label, parent: null };
}
nodes.B.parent = nodes.C.parent = nodes.A;
nodes.D.parent = nodes.E.parent = nodes.B;
nodes.F.parent = nodes.G.parent = nodes.C;

// Perform the algorithm
let path = findPath(nodes.E, nodes.G);

// Output the result
console.log("Path from E to G is:");
for (let node of path) {
    console.log(node.label);
}