运行展平二叉树的时间

时间:2017-12-08 02:57:52

标签: algorithm python-3.x tree

对于在给定此结构的情况下展平二叉树的简单算法:

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空间。

我是否正确地思考这个问题?

1 个答案:

答案 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)额外空间。