我在想是否有可能只使用O(1)空间打印二叉树的广度优先遍历结果?
难点在于需要使用额外的空间来记忆下一层需要遍历的节点,这个空间会随着n的增加而增加。
既然对时间没有任何限制,也许有一些效率低(就时间而言)但可以实现这一目标的方法?
您有什么想法吗?
难点在于需要使用额外的空间来记忆下一层需要遍历的节点,这个空间会随着n的增加而增加。
既然对时间没有任何限制,也许有一些效率低(就时间而言)但可以实现这一目标的方法?
您有什么想法吗?
heapq
文档:heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
。为了比较,认为不存在的元素是无限的。堆的有趣属性是它的最小元素总是根 heap[0]
。[由 François Pinard 解释] 0
1 2
3 4 5 6
7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
for value in the_heap:
print(value)
在空间复杂度上是O(1)。
我知道这严格来说不是问题的答案,但是可以通过递归迭代加深深度优先搜索(IDDFS)以O(d)空间访问树的节点,其中d是树的深度。当然,堆栈需要占用一定的空间。对于平衡树,d = O(lg n),其中n是节点数。老实说,如果没有@Charlie Martin建议的反向链接,我真的看不出如何在恒定的空间中完成它。
实现一个递归方法来获取给定层的树的所有节点是很容易的。因此,我们可以计算树的高度并获取每个级别的所有节点。这是树的层次遍历
。但是,时间复杂度是O(n^2)
。以下是Java实现(source)。
class Node
{
int data;
Node left, right;
public Node(int item)
{
data = item;
left = right = null;
}
}
class BinaryTree
{
Node root;
public BinaryTree()
{
root = null;
}
void PrintLevelOrder()
{
int h = height(root);
int i;
for (i=1; i<=h; i++)
printGivenLevel(root, i);
}
int Height(Node root)
{
if (root == null)
return 0;
else
{
int lheight = height(root.left);
int rheight = height(root.right);
}
}
void PrintGivenLevel (Node root ,int level)
{
if (root == null)
return;
if (level == 1)
System.out.print(root.data + " ");
else if (level > 1)
{
printGivenLevel(root.left, level-1);
printGivenLevel(root.right, level-1);
}
}
}