You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树结构中查找最高父节点(顶层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"
                }
            }
        ]
    }
]
原代码错误点
  1. 递归调用的返回值没有被接收,向上查询父leader的结果直接丢失
  2. 逻辑顺序错误:未确认当前id属于该family的子节点就直接赋值leader,且匹配失败时直接返回当前遍历的family的leader,逻辑完全不符合需求
  3. 没有处理输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:48:03