下面使用Map和Vector实现递归级别顺序遍历的时间复杂度是什么?

时间:2015-10-10 10:44:55

标签: c++ algorithm dictionary vector stl

这是我自己在C ++中使用Map和Vector进行Level Order Traversal的实现。算法就是这样的:

  1. 使用递归
  2. 创建二进制搜索树
  3. 使用递归
  4. 创建级别的哈希映射以及每个级别中存在的节点
  5. 遍历每个键的HashMap并打印与键相关联的向量元素
  6. 由于我不擅长STL,因此无法找到确切的时间和空间复杂度。

    > // Level Order Traversal using Map and Vector
    > // Time Complexity = ;
    > // Space Complexity = ;
    >
    >      #include<iostream>
    >      #include<map>
    >      #include<vector>
    >     
    >     using namespace std;
    >     
    >     struct node
    >     {
    >       struct node *left;
    >       int data;
    >       struct node *right;
    >     };
    >     
    >     struct node *newNode(int a)
    >     {
    >       struct node *Temp = new struct node();
    >     
    >       Temp->left = NULL;
    >       Temp->data = a;
    >       Temp->right = NULL;
    >     
    >       return Temp;
    >     }
    >     
    >     void createNode(struct node **root,int x)
    >     {
    >       if(*root!=NULL)
    >       {
    >           if(x < (*root)->data)
    >               createNode(&(*root)->left,x);
    >           else
    >               createNode(&(*root)->right,x);
    >       }
    >       else
    >           *root = newNode(x);
    >     }
    >     
    >     void _getLEVEL(struct node *root,int level,int *ML,map<int,vector<int>> &LevelMap)
    >     {
    >       if(root==NULL)
    >           return;
    >     
    >       if(level > *ML)
    >           *ML = level;
    >       LevelMap[*ML].push_back(root->data);
    >       _getLEVEL(root->left,level+1,ML,LevelMap);
    >       *ML=0;
    >       _getLEVEL(root->right,level+1,ML,LevelMap);
    >     
    >     }
    >     
    >     void _printLevel(map<int,vector<int>> &LevelMap)
    >     {
    >       map<int,vector<int>>::iterator i;
    >     
    >       for(i=LevelMap.begin() ; i!=LevelMap.end() ; i++)
    >       {
    >           cout<<"Level "<<i->first<<" : ";
    >           for(int j=0 ; j<=i->second.size()-1; j++)
    >               cout<<i->second[j]<<" ";
    >           cout<<endl;
    >       }
    >     
    >     }
    >     
    >     void printTree_LEVELORDER(struct node *root)
    >     {
    >       int MaxLevel = 0;
    >       map<int,vector<int>> LevelMap;
    >       _getLEVEL(root,0,&MaxLevel,LevelMap);
    >       _printLevel(LevelMap);
    >     }
    >     
    >     int main()
    >     {
    >       int arr[] = {6,3,8,2,9,7,10};
    >       int n = sizeof(arr)/sizeof(arr[0]);
    >     
    >       struct node *Tree=NULL;
    >     
    >       for(int i=0 ; i<=n-1 ; i++)
    >           createNode(&Tree,arr[i]);
    >     
    >       cout<<"The Level Order Traversal is : "<<endl;
    >       printTree_LEVELORDER(Tree);
    >       cout<<endl;
    >     
    >       cin.get();
    >       return 0;
    >     }
    

1 个答案:

答案 0 :(得分:1)

我正在跳过O(1)内容。

在main中,第一个createNode被称为n次。 createNode本身会在树中搜索插入位置,直到每个级别:log(n)。 =&GT; O(n*log(n))

然后,在printTree_LEVELORDER中,调用_getLEVEL_printLevel

_getLEVEL首先:遍历整个树,并为每个树节点在其中一个向量中(在地图中)创建一个条目。由于有n个节点,在所有向量中,一旦函数完成,就会有n个条目(只是在映射中的几个向量之间分开)=&gt; O(n)

然后_printLevel打印地图中所有矢量的所有元素。通常为O(n * m),但据我们所知,总共只有O(n)个元素,它也是O(n)

O(n*log(n)) + O(n) + O(n) = O(n*log(n))是最终的最坏情况时间复杂度。

空格O(n):一个包含n个元素且完全为
的数组 每个树节点和一个地图矢量元素。