【发布时间】:2021-12-09 16:58:53
【问题描述】:
我需要一些帮助来查找树中两个节点的 Lca。那么任何人都可以解释如何使用递归遍历到某个点并返回结果。我看到了很多例子,但没有一个能真正帮助我。这种问题对我来说真的很新,我从来没有使用递归来遍历树结构。感谢任何帮助!
这就是我的树的样子,这是众多示例之一,因为它是随机生成的,而且我不能使用任何循环或 forEach,仅允许使用数组方法。
const tree = {
children: [
{
children: [
{
children: [],
values: [15.667786122807836]
}
],
values: [35.77483035532576, 1.056418140526505]
},
{
children: [
{
children: [
{
children: [],
values: [67.83058067285563]
}
],
values: [98.89823527559626]
}
],
values: [51.49890385802418, 41.85766285823911]
},
],
values: [6.852857017193847, 28.110428400306265, 51.385186145220494]};
这就是我想要做的:
const min = graph => {
return Math.min(...graph.values, ...graph.children.map(graphNode => min(graphNode)));
};
const max = graph => {
return Math.max(...graph.values, ...graph.children.map(graphNode => max(graphNode)));
};
const distance = graph => {
if (!graph.children.length && !graph.values.length) return;
const minValue = min(graph);
const maxValue = max(graph);
const findPath = (graph, key1, key2) => {
if (graph.values.includes(key1) || graph.values.includes(key2)) {
return graph.values;
};
const arr = [graph.values].concat(graph.children.map(graphNode => {
return findPath(graphNode, key1, key2);
}));
return arr;
};
const Lca = findPath(graph, minValue, maxValue);
return Lca;
}
【问题讨论】:
-
你能概括一下你的通用算法是什么吗?您的问题陈述说您有 2 个节点并且需要返回最低的共同祖先,但您的代码似乎做了其他事情。
-
所以首先我试图找到从根节点到具有最小值和最大值的每个节点的路径,如果找到了一些值,我将返回节点。其实我不知道下一步该怎么做。我正在尝试使用此处提供的解释:geeksforgeeks.org/…
-
但是没有类,就像上面的链接一样。我的函数也必须是纯的
-
对我来说最困难的部分是我的根节点有 3 个子节点,我如何才能仅返回从根节点到具有最小值或最大值的节点的路径
-
为什么要查找具有最小值/最大值的节点?你不是给了2个节点,你想找到他们的LCA吗?你为什么关心根到最小/最大节点路径?你的 LCA 可以是任何节点,包括根节点。我不确定你知道 2 个节点的最低共同祖先是什么。
标签: javascript recursion data-structures binary-tree