【问题标题】:tree traversal runtime and space analysis general approach树遍历运行时和空间分析一般方法
【发布时间】:2021-08-16 19:35:14
【问题描述】:

我目前在 leetcode 上的 94. Binary Tree Traversal 上,我不确定如何分析问题的运行时间和空间复杂度。在我看来,这个问题的时间复杂度似乎是 O(n),其中 n 是树中的节点数,因为我们需要遍历树中的每个节点。但是,对于空间来说争议更大,我认为是 O(h),其中 h 是树的最大高度,因为我认为递归引起的调用堆栈可以达到树的最大高度,并且当我们回溯时,堆栈将弹出。有人认为它实际上是 O(n),因为在树完全左偏或右偏的最坏情况下,调用堆栈与可用节点的数量一样深,但不是 O(h) 也适用于此因为最大高度也是树中节点的数量。虽然 O(n) 是最坏的情况,但 O(h) 似乎更准确,更适合包括上面的示例在内的更多场景,答案应该是哪一个?或者更具体地说,在编码面试中面试官会接受哪一个?

我还将在此处粘贴我的解决方案:

class Solution {
public List < Integer > inorderTraversal(TreeNode root) {
    List < Integer > res = new ArrayList < > ();
    helper(root, res);
    return res;
}

public void helper(TreeNode root, List < Integer > res) {
    if (root != null) {
        if (root.left != null) {
            helper(root.left, res);
        }
        res.add(root.val);
        if (root.right != null) {
            helper(root.right, res);
        }
    }
}

}

【问题讨论】:

    标签: algorithm complexity-theory space-complexity code-complexity


    【解决方案1】:

    空间复杂度总是 O(n),即使树是平衡的。这是因为 input 作为 output 的大小都是 O(n)。 输出分配的内存,所以即使我们忽略输入已经占用的内存,算法仍然会使用 O(n) 额外的内存。

    如果我们也不计算输出所需的内存,那么空间复杂度确实是 O(h)。

    现在,使用输入树的高度作为渐近复杂度的参数已经不太常见了。为此目的使用节点数更为常见。

    但是在面试中提到任何一个都可以,只要你清楚 哪个 空间是打算的:它只是关于 辅助 空间吗? ...不包括输出可能占用的辅助空间?​​

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多