【问题标题】:What is the best way to determine the number of subtrees having exactly 4 nodes?确定恰好具有 4 个节点的子树数量的最佳方法是什么?
【发布时间】:2016-01-18 23:42:01
【问题描述】:

考虑使用指针表示的有根 n 节点二叉树。确定恰好具有 4 个节点的子树数量所需的时间的最佳上限是 O(n^a Log^b(n))。那么a+10b的值就是__________。


我的尝试:

某处算法如下:

int print4Subtree(struct Node *root) {
    if (root == NULL)
      return 0;
    int l =  print4Subtree(root->left);
    int r =   print4Subtree(root->right);
    if ((l + r + 1) == 4)
       printf("%d ", root->data);
    return (l + r + 1); }

这个算法运行 O(n) time ,所以答案是 1 。

它是正确的还是存在其他更好的算法?

请用正式/替代的方式解释一下。

【问题讨论】:

  • 我没有看到任何日志因素进入图片。此外,您需要至少访问所有节点一次,因此复杂度最小为 O(n),而这个算法是。所以,我想你是对的。
  • @vish4071 从理论上讲,你没有。您不必为每个子树查找第五个节点之后的节点。
  • @Magisch,为什么不呢?某个节点的第 5 个节点是其他节点的第 4 个。
  • @vish4071 但是你可以停止寻找那个子树。如果一个节点碰巧超过一棵树的第五个并且没有链接到其他树,它将不会被访问。
  • @j_random_hacker 在一个合理平衡的二叉树中,大约一半的节点是叶子(所以平均来说仍然是 O(n)),即使我们只是访问较低的节点。

标签: c algorithm binary-tree time-complexity asymptotic-complexity


【解决方案1】:

在计算机科学中,子树通常意味着它下面没有其他节点连接,但在图论中,术语子树并不意味着这一点——它仅表示也是一棵树的子图(节点和边的子集)。所以例如如果您有一个 10 节点路径,根在一端,则根据图论定义有 7 个子树,而不是 1 个。根据图论定义,通常有(很多)更多子树......这可能是问题中日志因子的来源。

另一方面,只有 恒定数量 的 4 节点有根二叉树——我总共数了 14 棵(8 棵高度为 3 的树,4 棵高度为 2 的树,其中root 有 2 个孩子,以及 2 个 height-2 树,其中 root 有 1 个孩子)。因此,即使使用新的、更广泛的定义,也可以检查树中的每个节点,以查看 14 个可能的 4 节点有根二叉树中的哪一个以该节点为根,并将此计数添加到总计中,全部在O(n) 时间。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2017-10-21
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多