/* Function to get diameter of a binary tree */
int diameter(struct node * tree)
{
/* base case where tree is empty */
if (tree == 0)
return 0;
/* get the height of left and right sub-trees */
int lheight = height(tree->left);
int rheight = height(tree->right);
/* get the diameter of left and right sub-trees */
int ldiameter = diameter(tree->left);
int rdiameter = diameter(tree->right);
return max(lheight + rheight + 1, max(ldiameter, rdiameter));
}
int height(struct node* node)
{
/* base case tree is empty */
if(node == NULL)
return 0;
/* If tree is not empty then height = 1 + max of left
height and right heights */
return 1 + max(height(node->left), height(node->right));
}
使用此实现查找树直径的时间复杂度如何为O(n ^ 2),其中n是树中节点的数量?
答案 0 :(得分:0)
它是O(n ^ 2)因为高度计算也是递归的。 您可以编写递归关系并解决它。
你可以看到f(n)是线性的,因此c = 1 因此,当a为4(递归使用4次)且b为2(在树的一半上)时,复杂性为log a到b
答案 1 :(得分:0)
让D()
表示diameter()
,H()
表示height()
。为方便起见,我们假设二叉树为Complete Binary Tree
,以便左子树和右子树具有相同数量的元素。我们还假设二叉树中有N
个元素。现在可以使用以下递归关系表示直径函数的时间复杂度。
D(N) = 2D(N/2) + 2H(N/2) + c1 ----- 1
由于diameter()
中的以下递归调用,
int lheight = height(tree->left);
int rheight = height(tree->right);
int ldiameter = diameter(tree->left);
int rdiameter = diameter(tree->right);
现在让我们分析height()
,
表示height()
的时间复杂度的递归关系是,
H(N) = 2H(N/2) + c2 ------ 2
由于height()
中的以下递归调用,
return 1 + max(height(node->left), height(node->right));
现在H(N) = O(N logN)
通过在2上应用Master Theorem。
将其替换为1,我们得到,
D(N) = 2D(N/2) + c3 N logN + c1 ------ 3
使用主定理解决 3 ,我们得到D(N) = O(N logN)
。
因此,递归函数diameter()
的复杂性为O(N logN)