级别顺序遍历的时间复杂度

时间:2012-12-29 14:44:20

标签: algorithm data-structures big-o time-complexity tree-traversal

二叉树级别订单遍历的时间复杂度是多少?是O(n)还是O(log n)?

void levelorder(Node *n)
{    queue < Node * >q;
     q.enqueue(n);

     while(!q.empty())
      {
         Node * node = q.front();
         DoSmthwith node;
         q.dequeue();          
         if(node->left != NULL)
         q.enqueue(node->left);
         if (node->right != NULL)
         q.enqueue(node->right);
      }

}

3 个答案:

答案 0 :(得分:6)

O(n),或者是Theta(n)

查看树中的每个节点 - 每个节点最多被“访问”3次,并且至少一次) - 当它被发现时(所有节点),当从左子回来时(非叶子)当从右儿子(非叶子)回来时,最多总共3 * n次访问,并且每个节点至少访问n次。每次访问都是O(1)(排队推送/弹出),总计在 - Theta(n)

答案 1 :(得分:1)

解决此问题的另一种方法是确定水平顺序遍历与图表的breadth-first search非常相似。广度优先遍历的时间复杂度为O(|V| + |E|),其中|V|是顶点数,|E|是边数。

在树中,边数约等于顶点数。这使得节点数总体上线性

答案 2 :(得分:0)

时间和空间复杂度为O(n)。 n =不。节点。

  

空间复杂度 - 队列大小与节点数成正比   为O(n)

     

时间复杂度 - 每次访问两个节点时的O(n)。一次期间   入队行动,一次出列行动。

这是BFS的一个特例。您可以阅读BFS(广度优先搜索)http://en.wikipedia.org/wiki/Breadth-first_search