二叉树级别订单遍历的时间复杂度是多少?是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);
}
}
答案 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。