问题描述
我应该找到这段代码的循环函数,但我真的很困惑我所做的是否正确。我会放---线来尝试展示我的思维方式。
假设树是平衡的。
// compute tree height (longest root-to-leaf path)
int height(TreeNode* root) {
if (root == NULL) return 0; **-------- C**
else {
// Find height of left subtree,height of right subtree
//Use results to determine height of tree
return 1 + max(height(root->left),height(root->right)); **---- n/2**
}
}
我相信这段代码的循环函数是 T(n) = c + n/2,但我觉得我错过了一些东西。
解决方法
递归关系为:
T(n) = 2T(n/2) + 1
在任何层级上都有一些操作,还有对左右子树的 2 次调用。
我们可以从这里推导出时间复杂度:
T(n) = 2T(n/2) + 1
= 2 [2(T(n/4) + 1] + 1
= 4T(n/4) + 1 + 1= 4T(n/4) + 2
= 4 [2T(n/8) + 1] + 2
= 8T(n/8) + 3
= 2kT(n/2k) + n
• 持有 n = 1,2,... 令 n = 2k,所以 k=log2 n
= T(1) + n log(n)
所以时间复杂度为 nlog(n)