【发布时间】:2018-04-25 13:07:47
【问题描述】:
我有一个典型的树数据结构,如下所示:
[
{
data: object,
subs:
[ ...other objects... ]
},
...other objects...
]
它可以有任何形状和数量的节点。
我写了一个方法,它应该递归地找到并返回根 r 和给定对象 o 之间的路径(中间对象数组)。 (无论是否包括 r 和 o 我都不在乎)
public getPath(tree: Array<object>, o: object): Array<object> {
let path: Array<object> = [];
function f(subtree: Array<object>): void {
for (let node of subtree) {
path.push(node['data']);
if (node['data'] == o) return;
else if (node['subs'].length > 0) f(node['subs']);
else path = [];
}
}
f(tree);
return path;
}
基本上我的想法是
- 始终将每个对象添加到从 r 到 o 的遍历期间访问的数组中,
- 如果遍历的路径不是从 r 到 o 的路径,则清空数组,
- 如果到达 o 则返回应该结束遍历的位置。
结果:
- 它适用于 r 作为 o,返回 [r]。
- 它也适用于 r 作为 o 的第一个孩子,返回 [r,r 的第一个孩子强>]。
- 但是对于选择任何其他对象作为o,不仅返回正确路径的对象,还返回树的许多其他对象。
【问题讨论】:
-
您实际上将所有测试过的项目推送到
path,无论它们是否是搜索的对象,即使它们在通往它的好路径中也不行。你应该从@返回一个值987654324@ 并测试结果以了解是否在此子树中找到它,以了解是否添加了路径。注意:将对象与node['data'] == o进行比较仅在它们是具有相同引用的相同对象时才有效,即使键和值相同,使用此函数并为其提供新创建的对象getPath({a: val})也将不起作用。跨度>
标签: javascript typescript recursion tree