对于在给定此结构的情况下展平二叉树的简单算法:
class Tree(object):
def __init__(self, x):
self.value = x
self.left = None
self.right = None
将二进制树展平为数组的算法的运行时间是多少?
def flatten(root):
if root == None:
return []
return flatten(root.left) + [root.value] + flatten(root.right)
我认为它是N
时间,2N
空间复杂度,因为算法是从根然后到左边和右边节点。
我认为这是2N
空间复杂度,因为你仍然拥有树占用的N空间和结果数组中的N
空间。
我是否正确地思考这个问题?
答案 0 :(得分:2)
通常,二阶树的有序遍历的运行时间是O(N),因为您只访问树中的每个节点一次。但是,您的代码是连接数组,根据https://stackoverflow.com/a/33191492/56778,它是一个O(N)操作。如果这看起来是真的,那么代码的运行时间将为O(N ^ 2)。
在谈论空间复杂性时,我们通常会讨论额外的空间:除了数据结构已占用的空间之外的空间。有时他们不会包含输出数组的空间。
在你的情况下,新数组需要O(N)空间,加上递归堆栈的O(log N)空间,如果树是平衡的。如果树是不平衡的,那么递归堆栈可能需要多达O(N)的额外空间。
因此,如果树是不平衡的,则额外空间是O(N)+ O(N),如果树是平衡的,则额外空间是O(N)+ O(log N)。无论哪种方式,它都被认为是O(N)额外空间。