考虑使用指针表示的有根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。
是否正确或存在任何其他更好的算法?
请您以正式/另类的方式解释。
答案 0 :(得分:2)
在计算机科学中,子树通常意味着它下面没有连接的节点,但在图论中,术语子树并不意味着这一点 - 它只是指一个子图(节点和边的子集),它也是一棵树。所以例如如果你有一个根节点在一端的10节点路径,根据图论定义有7个子树,而不是1.根据图论定义,通常有(很多)子树...这可能是日志因素来自问题。
另一方面,只有一个常数的4节点有根二进制树 - 我总计14个(8个高度 - 3个树,4个高度 - 2个树,其中root有2个子节点,2个高度为2的树,其中根有1个子节点。因此,即使使用新的更广泛的定义,也可以检查树中的每个节点,以查看14个可能的4节点有根二进制树中的哪一个以此节点为根,并将此计数添加到总计中,全部在O(n)时间。