树结构中查找最高父节点(顶层leader)的算法实现问题
需求说明
输入任意人员的_id值,无论该人员是leader还是子节点,都需要返回对应的顶层leader的id。
示例:输入Rahman的id "615e8215c3055d1addc216b0" 或者Aaron Aziz的id "61164b4bc08f86505e7dcdd8",都应该返回Aaron Aziz的id(他是该树的顶层leader)。
数据结构说明
数据本质为两层结构,每个顶层条目存储其直接子节点的引用,部分子节点可作为顶层条目的leader,以此构建更深层级的关联,完整数据如下:
"families": [ { "datecreated": "2021-10-06T07:39:28.988Z", "_id": "615d52cb7cc6d32978afa694", "leader": { "_id": "61164b4bc08f86505e7dcdd8", "name": "Aaron Aziz" }, "children": [ { "datejoined": "2021-10-06T07:39:28.988Z", "_id": "615d52cb7cc6d32978afa695", "child": { "_id": "615c15c66dd91a2d4385ac84", "name": "Amirul Adha" } }, { "datejoined": "2021-10-06T08:04:52.122Z", "_id": "615d58cf0f045f320cb28706", "child": { "_id": "615d58b40f045f320cb28701", "name": "Samirul Ali" } } ] }, { "datecreated": "2021-10-07T05:12:22.671Z", "_id": "615e8475c3055d1addc216b5", "leader": { "_id": "615c15c66dd91a2d4385ac84", "name": "Amirul Adha" }, "children": [ { "datejoined": "2021-10-07T05:12:22.671Z", "_id": "615e8475c3055d1addc216b6", "child": { "_id": "615e8215c3055d1addc216b0", "name": "Rahman" } } ] }, { "datecreated": "2021-10-07T08:52:47.840Z", "_id": "615eb630e0cc0d22281bb282", "leader": { "_id": "615e8215c3055d1addc216b0", "name": "Rahman" }, "children": [ { "datejoined": "2021-10-07T08:52:47.840Z", "_id": "615eb630e0cc0d22281bb283", "child": { "_id": "615eb60de0cc0d22281bb27d", "name": "Aizi" } } ] } ]
原代码错误点
- 递归调用的返回值没有被接收,向上查询父leader的结果直接丢失
- 逻辑顺序错误:未确认当前id属于该family的子节点就直接赋值leader,且匹配失败时直接返回当前遍历的family的leader,逻辑完全不符合需求
- 没有处理输入id本身就是顶层leader的场景
修改后代码
const findLeader = (currentId) => { // 遍历所有family,找currentId是不是某个family的子节点 for (const family of familiesCopy) { const isChild = family.children.find(item => item.child._id === currentId); if (isChild) { // 找到父family,递归查询父leader的顶层id并直接返回 return findLeader(family.leader._id); } } // 遍历完所有family都没找到父family,说明当前id就是顶层leader return currentId; }
测试验证
// 输入Aizi的id,返回Aaron Aziz的id:61164b4bc08f86505e7dcdd8 console.log(findLeader("615eb60de0cc0d22281bb27d")) // 输入Rahman的id,返回Aaron Aziz的id:61164b4bc08f86505e7dcdd8 console.log(findLeader("615e8215c3055d1addc216b0")) // 输入Aaron Aziz的id,返回自己的id console.log(findLeader("61164b4bc08f86505e7dcdd8"))
内容的提问来源于stack exchange,提问作者Faris Malik
相关产品推荐
相关产品推荐

