练练看
题目:
根据id,查询树状结构的数据,找到对应id的路径。
数据如下:
const list1 = [
{
id: "ab",
children: [
{
id: "cd",
children: [
{
id: "ef",
children: [],
},
],
},
{
id: "fg",
children: [],
},
],
},
{
id: "ac",
children: [
{
id: "ce",
children: [
{
id: "eg",
children: [],
},
],
},
],
},
];
解析:
第一直觉,深度优先算法
采用递归实现
需保存搜索路径,数组保存, 采用pop移除当前搜索
引用数据类型拷贝
优化:查到以后不再继续递归
// 方法1:
let res = []; // 路径数组
let result = null; // 查找结果
let flag = false; // 是否已查到
function find(arr, id) {
if (flag) return;
if (arr.length > 0) {
arr.forEach((it, index) => {
res.push(it.id);
// 输出首次查到的路径
if (res.includes(id) && !flag) {
flag = true;
result = [...res].join("->");
}
if (it.children.length > 0) {
return find(it.children, id);
}
res.pop();
});
}
res.pop();
return arr;
}
// 方法2:
find = (arr, id, way=[]) => {
for (let it of arr) {
console.log(it.id);
way.push(it.id);
if (it.id === id) {
return way;
}
if (it.children.length) {
return find(it.children, id, way);
}
way.pop();
}
return way;
}
// 测试
find(list1, "cd");
console.log(result);
测试
find(list1, "eg");
console.log(result); // ac->ce->eg