给定一个二叉树,我想返回最大和子树的根。
最大子树:树的子树,其所有节点的总和大于任何其他子树的总和。
编辑:节点值为整数。
我可以做以下需要O(n^2)的事情。
我可以将其更改为自底向上的方法,并使用hashmap存储节点到求和映射,这将使其成为O(N),但它将占用O(N)空间。
是否有任何方法/方法,即O(N)时间和O(1)空间?
是的,如果您在运行中计算总和,您可以在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。
这几乎就是您的解决方案,但需要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,输出显示每个元素出现在数