【发布时间】: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