【问题标题】:Run time of flattening a binary tree展平二叉树的运行时间
【发布时间】:2017-12-08 02:57:52
【问题描述】:

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

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

我是否以正确的方式思考这个问题?

【问题讨论】:

  • 顺便说一句 O(2N)O(N) 相同。空间复杂度通常只是衡量工作存储(不是您的起始和结束数据结构),它只是假设平衡树空间复杂度为O(log N)(最坏情况@987654330)的树深度的调用堆栈@)。

标签: algorithm python-3.x tree


【解决方案1】:

通常,按顺序遍历二叉树的运行时间为 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) 额外空间。

【讨论】:

  • 您的 O(N) 运行时间分类假定连接数组是一个恒定时间操作,与数组大小无关。我不是python专家,但例如在 Java 中,数组连接是线性时间的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多