在代码片段中查找重复函数

问题描述

我应该找到这段代码的循环函数,但我真的很困惑我所做的是否正确。我会放---线来尝试展示我的思维方式。

假设树是平衡的。

// 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)