找到叶子节点的路径

2,809 阅读1分钟

最近在工作中遇到这样一个需求:一个级联选择器(el-cascader),数据结构为[{value: '', children: []}]的树,后端只保存了叶子节点的value,前端展示时需要根据这个value找到对应的叶子节点的路径。虽然最后代码只有10几行,却着实让人动了一番脑筋,所以记录一下。

思路

既然是要找叶子节点,肯定是要用递归的深度优先遍历,问题的关键在保存路径并在找到后结束遍历,看到网上有人用throw来结束遍历,感觉过于暴力了。如果能判断子节点中已经找到,就可以把当前节点加入路径并返回上一层。

实现

function findLeafPathInTree(tree, target) {
  let path = null;
  for (let i = 0; i < tree.length; i++) {
    const node = tree[i];
    if (node.children && node.children.length > 0) {
      // 如果是中间节点,就继续往下遍历并保存结果
      path = findLeafPathInTree(node.children, target)
      // 如果有了结果,就把当前节点放入路径并返回
      if (path) {
        path.unshift(node.value);
        return path;
      }
    } else {
      // 在叶子节点中进行判断,符合条件就返回路径
      if (node.value == target) {
        return [node.value];
      }
    }
  }
  return path;
}

不知道这算不算回溯的思想

思考

以前觉得算法没什么用,只是用来应付面试的东西,但是这么一个小小的需求都想了好久,着实惭愧,看来以后应该恶补算法了。