时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)

time and space complexity creating vector of elements at each levels of a binary tree(NON-BST)

本文关键字:元素 创建 向量 NON-BST 空间复杂性 二叉树 时间      更新时间:2023-10-16

您能否帮助我了解计算以下函数的时间和空间复杂度。

函数(): 角色:创建每个级别的节点向量

  1. 创建队列。
  2. 添加根
  3. 将队列中的元素复制到向量。
  4. 遍历向量并将子项(左和右)附加到队列中。
  5. 重复步骤3和4,直到队列为空。

下面是代码。

struct node {
     int value;
     struct node* p_left;
     struct node* p_right;
};
void levels_list(struct node* p_btree) {
     if(!p_btree) {
          return ;
     }

     std::queue<struct node*> q;
     std::vector<std::vector<struct node*> > v1;
     q.push(p_btree);
     bool choice = false;
     while(!q.empty()) {
          std::vector<struct node*> v;
          while(!q.empty()) {
               v.push_back(q.front());
               q.pop();
          }
          for(int i = 0; i < v.size(); i++) {
               if(v[i]->p_left) {
                    q.push(v[i]->p_left);
               }
               if(v[i]->p_right) {
                    q.push(v[i]->p_right);
               }
          }
          v1.push_back(v);
          v.clear();
     }
}

看到它是 O(n^2),我说得对吗?有两个循环,第一个是外部循环,第二个是内部循环,它将元素从队列推送到向量中。

谢谢

在每次迭代开始时,q都有一组节点。在每次迭代结束时,q都有一组子项。因此,循环的每次迭代都是一个级别。

每个级别仅处理该级别的节点。推回向量是O(1),从队列中推送和弹出是O(1)(摊销)。

我们没有比这更花哨的事情了。所以这是O(n)计算时间。由于 v 和 q 的大小永远不会大于 n(如果 bt 中有完全完整的行,它将是 ciel(n/2) ),并且 v1 只包含每个节点的一个,因此这也在空间中O(n)

话虽如此,上面的代码是一个很好的例子,说明如何编写一个复杂的精细算法。您最终会做很多不必要的复制和分配...没有理由使用这样的队列,甚至任何中间数据结构......您知道输出向量,并且可以跟踪每个级别在输出向量中的位置限制,因此您可以迭代它,直到达到大小为 0 的级别。如果您知道BST的元素数量,则可以预先分配它,它会很好并且缓存友好。