当前位置: 首页 > 知识库问答 >
问题:

二叉树上广度优先搜索的空间复杂度是多少?

戴凯歌
2023-03-14

下面是我用广度优先搜索逐级打印二叉树的Java解决方案(它有效!!)

public void printByLevel() {
    System.out.print("Elements By Level:");
    if(overallRoot!= null) {
        Queue<IntTreeNode> bfs = new LinkedList<IntTreeNode>();
        bfs.add(overallRoot);
        while(!bfs.isEmpty()) {
            IntTreeNode root = bfs.remove();
            System.out.print(" " + root.data);
            if(root.left!=null) 
                bfs.add(root.left);
            if(root.right!=null)
                bfs.add(root.right);
        }
    }
    System.out.println();
}

同样的空间复杂性也适用于我的树变异吗?我还没有生成一个测试用例,其中BFS队列将保存树中的所有节点。即使二叉树退化为链表,如下面我从BST获得的图片中所示,对树的正常操作需要O(n)时间和O(n)空间,BFS队列也最多容纳1个元素。

    1
     \
      2
       \
        3
         \
          4
           \
            5
             \
              ...`

谁能给我一个测试用例,在这个测试用例中,BFS队列将所有节点都保存在树中,证明空间复杂度为O(n)?

共有1个答案

尹雅健
2023-03-14

考虑“完整”或“完美”二叉树:

     .
   / .
  0  .
 / \ .
0    .
 \ / .
  0  .
   \ .
     .

在最后一次迭代中,队列将容纳树中大约一半的节点,因此复杂性为O(n/2),与O(n)相同。

 类似资料:
  • 二叉树上广度优先搜索的空间复杂度是多少?因为它一次只存储一个级别,我不认为它会是O(n)。

  • 遍历顶点的每个相邻边的时间复杂度是,例如,,其中是相邻边的数量。因此,对于顶点数,时间复杂度变为=,其中是图中的边总数。既然从队列中移除和添加顶点是,为什么它会作为添加到BFS的总体时间复杂度中?

  • 我已经查看了其他各种StackOverflow答案,它们都与我的讲师在幻灯片中写的不同。 深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m比d大得多,这很糟糕,但如果搜索树“浓密”,则可能比广度优先搜索快得多。 他接着说。。 空间复杂度为O(bm),即动作序列长度的空间线性!只需要存储从根到叶节点的单个路径,以及路径上每个节点的剩余未扩展兄弟节点

  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 假设BST的高度是h。如果我们要删除一个有两个子节点的节点,那么该过程的时间复杂度是多少。 我知道在普通的二叉树中,删除的时间复杂度是O(h);O(n)最坏情况和O(logn)最好情况。但是由于我们用它的右子树的最小节点替换删除节点的键,因此需要更多时间来找到最小键。 那么,有人知道如何解释这种情况下的时间复杂性吗?

  • 我必须为一个算法开发伪代码,该算法计算给定顶点V和边E的图G=(V,E)中连通分量的数量。 我知道我可以使用深度优先搜索或广度优先搜索来计算连接组件的数量。 但是,我想用最高效的算法来解决这个问题,但是我不确定每个算法的复杂度。 下面是一个用伪代码形式写DFS的尝试。 下面尝试以伪代码形式编写 BFS。 我的讲师说BFS与DFS具有相同的复杂性。 然而,当我搜索深度优先搜索的复杂度时,它是O(V^