这是我的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();
}
我知道我的广度优先搜索算法,我将访问树中的所有节点,因此算法的时间复杂度将为O(n) .
我在分析我的解决方案的空间复杂性方面遇到了麻烦 . 我从Space Complexity了解到,在分析空间复杂性时,您必须考虑从堆和堆栈分配的空间
在这里,我没有进行任何递归调用,因此空间复杂度将只是我为广度优先搜索队列分配的空间 . 我从这里读到BFS Complexity,广度优先搜索的空间复杂度是O(V),其中V是顶点的数量 .
相同的空间复杂度是否适用于我的树变化?我还没有生成一个测试用例,其中BFS队列将保存树中的所有节点 . 即使二进制树退化为链接列表,如下图所示,我从BST获得,其中树上的正常操作需要O(n)时间和O(n)空间,BFS队列将保留最多1个元素 .
1
\
2
\
3
\
4
\
5
\
...`
任何人都可以给我一个测试用例,其中BFS队列将保存树中的所有节点,证明空间复杂度是O(n)?
1 回答
考虑“完整”或“完美”二叉树:
在最后一次迭代中,队列将保留树中大约一半的节点,因此复杂度为
O(n/2)
,这与O(n)
相同 .