【问题标题】:time complexity of Print all nodes from root to leaves打印从根到叶子的所有节点的时间复杂度
【发布时间】:2015-05-30 02:18:27
【问题描述】:

我已经使用 DFS 和递归来编码这个问题,如下所示:

/**
 * recursive
 */
public static List<List<Integer>> printAllPath(TreeNode root) {
    List<List<Integer>> rst = new ArrayList<List<Integer>>();

    helper(rst, new ArrayList<Integer>(), root);
    return rst;
}

public static void helper(List<List<Integer>> rst, ArrayList<Integer> list,
                   TreeNode root) {
    if (root == null) {
        return;
    }
    list.add(root.val);
    if (root.left == null && root.right == null) {
        rst.add(new ArrayList<Integer>(list));
    }
    helper(rst, list, root.left);
    helper(rst, list, root.right);
    list.remove(list.size() - 1);
}

然后上网一搜,发现这个算法的平均时间复杂度是O(nlogn),最坏的情况是O(n^2),是这样吗?为什么?谁能解释一下?

我对分析树的时间复杂度不是很熟悉。在这个问题中,如果我用Queue来实现,时间复杂度应该是O(n)吧?因为我只迭代整个树一次。

但是如何分析使用递归的树的时间复杂度。

【问题讨论】:

  • 你想在这里解决什么问题?
  • @TimBiegeleisen 我不知道如何分析这个算法的时间复杂度
  • 不知道你要做什么,但是因为一旦运行时间应该是O(n),你就会触摸树中的每个节点。

标签: algorithm recursion time-complexity binary-tree depth-first-search


【解决方案1】:

您的代码显然收集并返回从根到叶节点的所有路径。它通过使用 DFS 来实现。在算法执行期间访问每个节点,并且没有一个节点被访问超过一次。但是,您必须在找到路径时打印或存储路径。在您的程序中,您创建新的ArrayList 并将其存储在变量rst 中。路径数等于叶节点数l,路径长度等于树的高度h,所以总复杂度为O(n + hl)

lh 的值不是独立的,所以让我们看看两个有趣的案例。在平衡二叉树的情况下,平均有n/2叶节点,高度为log2(n),即为O(nlogn)。另一方面,当树在链表中退化时,只有一个叶子,并且该路径的长度为n,因此这种情况的复杂度为O(n)

但是如何分析使用树的时间复杂度 递归?

关于时间复杂度,只计算递归调用的次数。如果空间复杂度是个问题,用迭代代替递归。

另请参阅:

【讨论】:

  • 你不觉得代码“rst.add(new ArrayList(list));”导致额外的复杂性?对于所有叶节点,我们这样做。 O((2^(l-1)) * O(logn))
  • 您好,您认为 h*l 的最坏情况是什么? O(nlogn)?
【解决方案2】:

在构建从根到叶的路径时,树中的每个节点都被触及一次,因此复杂度为O(N),其中N 是树中的节点数量,如上所述。

但是当根到叶路径添加到结果列表中时 (rst.add(new ArrayList&lt;Integer&gt;(list)); 在您的 sn-p 中),然后复制包含路径的整个数组。由于数组副本的复杂度与其长度成线性关系,并且表示从根到叶路径的数组大致包含h 节点,其中h 是树的高度,而不是O(N * h) 的整体复杂度。

例如,考虑完美二叉树。它有N / 2 叶节点,因此,每个N / 2 根到叶路径的长度为log N。遍历这些路径中的每一个——为了直接复制或打印——总共涉及到 log N * N / 2,相当于 O(N * h)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多