确定具有4个节点的子树数量的最佳方法是什么?

时间:2015-10-20 10:43:35

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

考虑使用指针表示的有根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)时间,因此答案为1。

是否正确或存在任何其他更好的算法?

请您以正式/另类的方式解释。

1 个答案:

答案 0 :(得分:2)

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

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