C++ 为什么下面代码的时间复杂度是O(n^2)? void level\u order\u recursive(结构节点*t,int h)/'h'是我的二叉树的高度 {/'t'是根节点的地址 for(int i=0;i right!=NULL) print_level(t->right,i-1);//递归调用 } }

C++ 为什么下面代码的时间复杂度是O(n^2)? void level\u order\u recursive(结构节点*t,int h)/'h'是我的二叉树的高度 {/'t'是根节点的地址 for(int i=0;i right!=NULL) print_level(t->right,i-1);//递归调用 } },c++,c,time-complexity,C++,C,Time Complexity,在最坏的情况下,时间复杂度将是O(n^2),但不能是2^n,因为每个级别的时间复杂度将是->O(n)+O(n-1)+O(n-2)+…+O(1)最坏的情况是O(n^2) 您混淆了h和n。h是树的高度。n显然是树中元素的数量。所以打印级别取最坏情况O($2^i),但也就是n 最坏的情况发生在退化树中,其中每个节点只有一个后续节点。在这种情况下,您有n个节点,但树的高度也是h=n。在这种情况下,对print_level的每次调用都会执行i步,将i从1加到h=n等于O($n^2) 您总是从树的根开始t,

在最坏的情况下,时间复杂度将是O(n^2),但不能是2^n,因为每个级别的时间复杂度将是->O(n)+O(n-1)+O(n-2)+…+O(1)最坏的情况是O(n^2)

您混淆了h和n。h是树的高度。n显然是树中元素的数量。所以打印级别取最坏情况O($2^i),但也就是n


最坏的情况发生在退化树中,其中每个节点只有一个后续节点。在这种情况下,您有n个节点,但树的高度也是h=n。在这种情况下,对print_level的每次调用都会执行i步,将i从1加到h=n等于O($n^2)

您总是从树的根开始
t
,每次增加一级(
i
),直到到达树的高度
h

你说这是一个二叉树,但你没有提到任何属性,例如平衡等等。所以我假设它可能是一个不平衡的二叉树,因此在最坏的情况下树的高度可能是
h=n
,其中
n
是节点数(这是一个完全不平衡的树,实际上看起来像一个列表)

这意味着
level\u order\u recursive
循环
n次。即,最坏的情况是树具有
n
级别

print\u level
接收根节点和要打印的级别。它递归地调用自己,直到达到该级别并打印出该级别。
也就是说,它循环
I
次(递归调用每次减少
I

所以你有
1+2+3+…+h
迭代。因为
h=n
你得到
1+2+3…+n
步骤。这是
(n*(n+1))/2
(高斯和公式),它位于
O(n^2)

如果你能保证树是平衡的,那么你将改善最坏情况,因为高度将是
h=ld(n)
,其中ld表示二元对数。

基于或,第3页和第4页,二元搜索算法类似于我们的情况,其时间复杂度为
T(n)=T(n/2)+c
。 除此之外,左侧和右侧的子树都被浏览,因此下面的公式中的2T(n/2)是一个遍历算法,而不是搜索算法

在这里,我将遵守问题,使用“h”而不是“n”

使用递归关系,可以得到以下证明:


每个级别的时间复杂度是如何线性的?像O(n)。你能解释一下吗?你在这里打印的“数据”是什么:cout data@meJustAndrew这是一个整数数据。这是我在这里没有提到的节点结构中定义的。它是二叉树的水平顺序遍历的递归版本。这个代码的时间复杂度应该是O(n^2)。请你检查一下,没有一点解释就没有多大意义。我用一个解释“前言”了我的回答。如果你需要更多的细节,请告诉我。
void level_order_recursive(struct node *t , int h) //'h' is height of my binary tree
{                                                 //'t' is address of root node
    for(int i = 0 ; i <= h ; i++)  
    {
        print_level(t , i);
    }
} 
void print_level(struct node * t , int i)
{
    if( i == 0)
        cout << t -> data <<" ";
    else
        {
            if(t -> left != NULL)
                print_level(t -> left , i - 1);   //recursive call
            if(t -> right != NULL)
                print_level(t -> right , i - 1); //recursive call
        }
}