Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二叉树在O(N)时间和O(1)空间中的每个子树和?_Algorithm_Data Structures_Binary Tree - Fatal编程技术网

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

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^2)的事情

  • 计算左子树中所有节点的总和
  • 计算右子树中所有节点的总和
  • 如果左子树和右子树的和以及根的值大于当前最大和,则根存储在结果中
  • 以左子树为根递归调用此函数
  • 以右子树作为根递归调用此函数。 这将需要O(n^2)
  • 我可以将其更改为自底向上的方法,并使用hashmap存储节点到求和映射,这将使其成为O(N),但它将占用O(N)空间


    有没有办法/方法,即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一次。