问题:给定二叉搜索树,打印出最长的路径。
方法:存储每个级别的可能深度,并过滤出最长的深度。这样做的时间复杂度必须至少为 O(n)
,因为我们从某种意义上来说是在计算树的直径。但是,在每个级别上,我们都在一组可能的路径上调用reduce
,以便确定每个阶段的最长路径。我认为这将使复杂性O(nk)
变得更复杂,其中k
是每个阶段的数组长度。空间复杂度为O(n + k + j),其中n是递归调用的深度,而k和j是数组。
问题:这种对时间复杂度的分析正确吗?二,如何在O(n)
时间内完成?
function printLongestPath(root = this.head, paths = [], finishedPaths = []) {
if (!root) return;
paths.push(root.data);
if (!root.left && !root.right) {
finishedPaths.push(paths);
paths.pop();
return;
}
this.printLongestPath(root.left, paths, finishedPaths);
this.printLongestPath(root.right, paths, finishedPaths);
// Pop once more once both paths have finished because it means we are in an intermediary step
paths.pop();
return finishedPaths.reduce((longest, current) => {
return current.length > longest.length ? current : longest
}, finishedPaths[0]);
}