[js] 查找树结构数据中的指定节点,查找指定节点的所有叶子节点,查找整棵树的所有叶子节点, 获取指定节点的所有子孙节点,判断树形结构中的某个节点是否为叶子节点

查找指定节点 children

// 查找指定节点
findNodeInTreeByCode(tree, target) {
  for (const node of tree) {
    if (node.id === target) {
      return node;
    }
    if (node.children && node.children.length > 0) {
      const foundNode = this.findNodeInTreeByValue(node.children, target);
      if (foundNode) {
        return foundNode;
      }
    }
  }
  return null;
},

查找指定节点的所有叶子节点 children

// 查找指定节点的所有叶子节点
findLeafNodes(tree, target) {
  const targetNode = this.findNodeInTreeByValue(tree, target);
  if (!targetNode) {
    return null;
  }
  const leafNodes = [];
  function traverse(node) {
    if (!node.children || node.children.length === 0) {
      leafNodes.push(node);
    } else {
      for (const child of node.children) {
        traverse(child);
      }
    }
  }
  traverse(targetNode);
  return leafNodes;
},
   

查找整棵树的所有叶子节点 children

// 查找整棵树的所有叶子节点
findAllLeafNodes(tree) {
  const leafNodes = [];
  function traverse(node) {
    if (!node.children || node.children.length === 0) {
      leafNodes.push(node);
    } else {
      for (const child of node.children) {
        traverse(child);
      }
    }
  }
  for (const node of tree) {
    traverse(node);
  }
  return leafNodes;
},

获取指定节点的所有子孙节点 parentId

/**
 * 获取指定节点的所有子孙节点
 * @param {Array} nodes 节点数组
 * @param {number|string} qingdanid 指定节点 qingdanid
 * @returns {Array} 所有子孙节点
 */
function getDescendants(nodes, id) {
  // 获取该节点的所有子节点
  const childNodes = nodes.filter((n) => n.parentId === id);
  // 如果没有子节点,则返回空数组
  if (childNodes.length === 0) {
    return [];
  }
  // 递归地获取每个子节点的子孙节点,并将它们拼接到当前数组中
  return childNodes.concat(
    childNodes.map((node) => getDescendants(nodes, node.id)).flat(),
  );
}

判断树形结构中的某个节点是否为叶子节点 parentId

/**
 * 判断树形结构中的某个节点是否为叶子节点
 * @param {Object} row 当前行对象
 * @param {Array} arr 要搜索的数组
 * @returns {boolean} true 为叶子节点,false 为非叶子节点
 */
function isTreeLeafNode(row, arr) {
  // 顶层节点
  if (!row.parentId) {
    return false;
  }
  // 在数组中查找该节点的子节点
  const res = arr.find((item) => item.parentId === row.id);
  return !res;
}

查找指定节点的所有父节点 parentId

/**
 * 查找指定节点的所有父节点
 * @param {Array} arr 节点数组
 * @param {string} targetId 目标节点 ID
 * @returns {Array} 所有父节点的 ID 组成的数组
 */
function findParentNodes(arr, targetId) {
  const result = []; // 保存结果的数组

  arr.forEach((node) => {
    if (node.id === targetId && node.parentId !== null) {
      // 如果当前节点就是目标节点且它的父节点不为空,则将父节点 ID 添加到结果数组中
      result.unshift(node.parentId);
      // 递归查找父节点的父节点
      result.unshift(...findParentNodes(arr, node.parentId));
    }
  });

  return result; // 返回结果数组
}

查找树中的第一个叶子节点 children

/**
 * 查找树中的第一个叶子节点
 * @param {Object[]} tree - 树状结构
 * @returns {Object|null} - 第一个叶子节点,如果未找到则返回null
 */
function findFirstLeafNode(tree) {
  // 定义递归函数 traverse,用于深度搜索树的每个节点
  function traverse(node) {
    // 如果当前节点为叶子节点,即没有子节点,则返回该节点
    if (!node.children || node.children.length === 0) {
      return node;
    }
    // 如果当前节点有子节点,则遍历每个子节点,继续递归调用 traverse 函数
    for (const child of node.children) {
      const result = traverse(child);
      // 如果在子节点中找到了第一个叶子节点,则立即返回该节点
      if (result) {
        return result;
      }
    }
  }

  // 外部循环遍历树的根节点
  for (const node of tree) {
    // 对于每个根节点,都调用 traverse 函数来查找第一个叶子节点
    const result = traverse(node);
    // 如果在当前根节点下找到了第一个叶子节点,则立即返回该节点
    if (result) {
      return result;
    }
  }
  return null;
}
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值