Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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 删除二进制三中不’;t位于sum>;=K_Algorithm_Binary Tree - Fatal编程技术网

Algorithm 删除二进制三中不’;t位于sum>;=K

Algorithm 删除二进制三中不’;t位于sum>;=K,algorithm,binary-tree,Algorithm,Binary Tree,无法理解给出的答案 请有人帮我理解一下 我的算法: 递归地找到每个路径的和。 如果sum>=k,则将路径中的所有节点放入哈希集中 在遍历树的最后,删除hashset中不存在的节点 我敢肯定,这里还有很多改进的余地 您有一个树,并且递归地解析它,如下所示: go_node(Node node){ go_node(node.left); go_node(node.right); } 在您的示例中,您希望删除任何值小于给定数字的子树。解决方法很简单,我们稍微改变一下简单的函数,问题就解决了。

无法理解给出的答案 请有人帮我理解一下

我的算法:

递归地找到每个路径的和。 如果sum>=k,则将路径中的所有节点放入哈希集中 在遍历树的最后,删除hashset中不存在的节点


我敢肯定,这里还有很多改进的余地

您有一个树,并且递归地解析它,如下所示:

go_node(Node node){
  go_node(node.left);
  go_node(node.right);
}
在您的示例中,您希望删除任何值小于给定数字的子树。解决方法很简单,我们稍微改变一下简单的函数,问题就解决了。我让“K”作为全局变量,使代码尽可能简单。不过,您也可以在go_节点方法中解析它

int go_node(Node node, int value){
  this.total_value = value;
  total_value += go_node(node.left, value);
  if (node.left.total_value < K){
     node.left = null;
  }
  total_value += go_node(node.right, value);
  if (node.right.total_value < K){
     node.right = null;
  }
  return total_value;
}
int go_节点(节点节点,int值){
此值为总值=总值;
total_value+=go_节点(node.left,value);
if(node.left.total_值

为什么我现在可以删除它们?当某个值从左子树或右子树返回时,该子树被“完成”,它被处理,重要的是,它给了我所有子树的加法。因此,当该节点的total_值小于K时,意味着该节点和该节点的所有子节点(以及子节点的子节点等)都小于K。因为当子树子节点返回值时,该子节点的total_值存储了所有子树的值。

方法是遍历树并以自下而上的方式删除节点。遍历树时,递归计算每个路径从根节点到叶节点的节点总数。对于每个访问的节点,根据给定的和“k”检查计算出的总和。如果总和小于k,则释放(删除)该节点(叶节点),并将总和返回到前一个节点

public int removeNodesUtil(Node node, int sum, int k)
{
    if (node == null) return sum;

    sum =sum + node.data;
    if (node.left == null && node.right == null) 
    {
        if (sum < k)
        {
            node = null;
        }
        return sum;
    }
    int leftSum = 0, rightSum = 0, maxSum = 0;

    if (node.left != null) {
        leftSum = removeNodesUtil(node.left, sum, k);
        if (leftSum < k) {
            node.left = null;
        }
    }

    if (node.right != null) {
        rightSum = removeNodesUtil(node.right, sum, k);
        if (rightSum < k) {
            node.right = null;
        }
    }
    maxSum = Math.max(leftSum, rightSum);
    if (maxSum < k) {
        node = null;
    }
    return maxSum;
}
public int-removeNodesUtil(节点节点,int-sum,int-k)
{
if(node==null)返回和;
sum=sum+node.data;
if(node.left==null&&node.right==null)
{
if(总和
您的算法具有时间复杂性:O(n),您想改进什么?不想使用额外的空间,人们声称可以在单次遍历中完成。然后,摆脱哈希集,按照链接算法的方式执行,在遍历时进行修剪。代码就在那里,请具体说明您不理解的部分。很难理解这两个步骤://获取左右和的最大值;//如果最大值小于k,则必须删除此节点