当前位置: 首页 > 知识库问答 >
问题:

二叉树中的每个子树和在O(N)时间和O(1)空间?

籍兴文
2023-03-14

给定一个二叉树,我想返回最大和子树的根。

最大子树:树的子树,其所有节点的总和大于任何其他子树的总和。

编辑:节点值为整数。

我可以做以下需要O(n^2)的事情。

  1. 计算左子树中所有节点的总和
  2. 计算右子树中所有节点的总和
  3. 如果左子树和右子树的和以及根的值大于当前最大和,则根存储在结果中
  4. 以左子树作为根递归调用此函数
  5. 以右子树作为根递归调用此函数。这将需要O(n^2)

我可以将其更改为自底向上的方法,并使用hashmap存储节点到求和映射,这将使其成为O(N),但它将占用O(N)空间。

是否有任何方法/方法,即O(N)时间和O(1)空间?

共有2个答案

雍飞雨
2023-03-14

是的,如果您在运行中计算总和,您可以在O(n)中使用O(h)空间进行计算。在迭代树时。(在这里,h是树的最大高度,它是递归堆栈的大小)。

伪代码:

TreeSum(v):
  if (v == null):
    return 0
  v_sum = TreeSum(v.left) + TreeSum(v.right) + v.value
  # max_sum is some global space variable holding the max_sum.
  # you hold only once such variable.  
  if v_sum > max_sum:
    max_sum = v_sum 
  return v_sum 

完成后,max_value保存最大和的值
如果还需要节点本身,请保留一个额外的变量,该变量是指向相关节点的指针,并与max\u sum一起修改。

其思想是在树上进行后序遍历。首先计算每个子树的和,然后计算根的值
在计算每个子树的总和时,当您找到一个新的“最佳”子树时,还要修改max_sum。

郎宣
2023-03-14

这几乎就是您的解决方案,但需要O(n)和O(h)内存。您只需访问每个节点一次。

calculateSum(vertex):
    if not vertex:
        return 0    
    sum = calculateSum(left) + calculateSum(right) + vertex.value
    if (sum > max)
        max = sum
    return sum
 类似资料:
  • 我意识到BFS和DFS在一般图上的运行时间是O(n+m),其中n是节点数,m是边数,这是因为对于每个节点,必须考虑它的邻接列表。但是,当BFS和DFS在二叉树上执行时,它的运行时是什么呢?我相信它应该是O(n),因为可以走出一个节点的边的可能数量是恒定的(即2)。请确认这是否是正确的理解。如果不是,那么请解释一个二叉树上BFS和DFS的正确时间复杂度是多少?

  • 问题内容: 这不是功课,这是一个面试问题。 这里的要点是算法应该是恒定空间。我对没有堆栈的情况一无所知,我会发布我使用堆栈编写的内容,但是无论如何都没有关系。 这是我尝试的方法:我尝试进行预遍历,但到达了最左边的节点,但是我被卡在那里。我不知道如何在没有堆栈/父指针的情况下“递归”备份。 任何帮助,将不胜感激。 (我将其标记为Java,因为这是我很喜欢使用的语言,但是显然它与语言无关。) 问题答案

  • 这是BST Add中二进制搜索树中add的实现 我的问题是,即使二元搜索树是不平衡的,同样的策略是否也能用于分析add的运行时?你要做多少次切割。运行时不是仍然是O(logn),而不是O(n)吗?如果是这样的话,有人能证明为什么它会是O(n)吗?

  • 我有一个列表,可以包含两个自然数或两个以上的列表。每个列表还包含两个整数或两个其他列表,依此类推。e、 i.:[[4,7],[3,5],[9,1]]我需要使用递归来计算树中所有数字的总和,并编写以下代码: 代码不工作,因为它总是将sum返回到12,所以我的问题是,如何使它工作,但仍然使用递归?。我没有正确地识别基本情况吗?

  • 上面的函数将包含二叉树每个叶的路径的数组附加到全局数组。 代码工作正常,但我想删除全局变量,并使函数返回数组。我怎么能那样做?

  • 本文向大家介绍在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数,包括了在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数的使用技巧和注意事项,需要的朋友参考一下 给定一个范围从值1到n的元素数组。有些元素是重复的,而有些则缺失。目的是找到O(n)时间和O(1)额外空间中所有元素的频率。 输入值 输出结果 说明-最高元素是5,输出显示每个元素出现在数