Algorithm 二叉树在O(N)时间和O(1)空间中的每个子树和?
给定一个二叉树,我想返回最大和子树的根 最大子树:树的子树,其所有节点的总和大于任何其他子树的总和 编辑:节点值为整数 我可以做以下需要O(n^2)的事情Algorithm 二叉树在O(N)时间和O(1)空间中的每个子树和?,algorithm,data-structures,binary-tree,Algorithm,Data Structures,Binary Tree,给定一个二叉树,我想返回最大和子树的根 最大子树:树的子树,其所有节点的总和大于任何其他子树的总和 编辑:节点值为整数 我可以做以下需要O(n^2)的事情 计算左子树中所有节点的总和 计算右子树中所有节点的总和 如果左子树和右子树的和以及根的值大于当前最大和,则根存储在结果中 以左子树为根递归调用此函数 以右子树作为根递归调用此函数。 这将需要O(n^2) 我可以将其更改为自底向上的方法,并使用hashmap存储节点到求和映射,这将使其成为O(N),但它将占用O(N)空间 有没有办法/方法,即O
有没有办法/方法,即O(N)时间和O(1)空间?这几乎就是你的解决方案,但需要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
这几乎就是您的解决方案,但需要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
是的,如果您在运行中计算总和,您可以在
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)
空间进行此操作。在迭代树时。(在这里,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(1),因为每次递归调用都会增加调用堆栈。@新手每个节点只访问一次。在这个算法中,对于每个节点,您只为左和右子节点调用calculateSum一次。请注意,空间复杂度不是O(1),因为每次递归调用都会增加调用堆栈。@新手,您只访问每个节点一次。在这个算法中,对于每个节点,您只为左和右子节点调用calculateSum一次。