这是我自己在C ++中使用Map和Vector进行Level Order Traversal的实现。算法就是这样的:
由于我不擅长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;
> }
答案 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个元素且完全为
的数组
每个树节点和一个地图矢量元素。