最近在工作中遇到这样一个需求:一个级联选择器(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;
}
不知道这算不算回溯的思想
思考
以前觉得算法没什么用,只是用来应付面试的东西,但是这么一个小小的需求都想了好久,着实惭愧,看来以后应该恶补算法了。