Java 从二进制最大堆中删除根节点的算法

Java 从二进制最大堆中删除根节点的算法,java,algorithm,binary-tree,heap,Java,Algorithm,Binary Tree,Heap,我坐在这里看的是一个算法,用于删除二进制max堆中的根节点,然后用新根更新树。下面是它的外观: if (n==0) { empty = true; } else { empty = false; top = a[1]; a[1] = a[n]; n = n-1; parent = 1; child = 2; while (child<=n-1) { if (tab[child]<tab[child+1]){ child = chi

我坐在这里看的是一个算法,用于删除二进制max堆中的根节点,然后用新根更新树。下面是它的外观:

if (n==0) {
  empty = true;
} else {
  empty = false;
  top = a[1];
  a[1] = a[n];
  n = n-1;
  parent = 1;
  child = 2;

  while (child<=n-1) {
    if (tab[child]<tab[child+1]){
      child = child+1;
    }
    if (tab[child]>tab[parent]) {
      swap[tab[child],tab[parent]);
      parent=child;
      child=parent*2;
    } else {
      child=n;
    }
  }
}
if(n==0){
空=真;
}否则{
空=假;
top=a[1];
a[1]=a[n];
n=n-1;
父母=1;
child=2;

while(child您必须检查两个子节点。从二进制最大堆中删除的规则是:

  • 结果是堆顶部的节点(即根节点)
  • 将项目从堆的末尾移动到堆的顶部
  • 插入的项目小于其最大的子项,请将其与最大的子项交换
  • 您的代码没有正确执行步骤3。您首先必须确定哪个是最大的子级


    我怀疑代码正在使用
    (child)您必须检查两个子节点。从二进制最大堆中删除的规则是:

  • 结果是堆顶部的节点(即根节点)
  • 将项目从堆的末尾移动到堆的顶部
  • 插入的项目小于其最大的子项,请将其与最大的子项交换
  • 您的代码没有正确执行步骤3。您首先必须确定哪个是最大的子级


    我怀疑代码使用的是
    (child不要忘记
    child
    只是存储二进制堆的数组的索引。这意味着如果到达
    n
    第th个元素,则可以停止,因为最后一个元素已从树中删除


    您从不将
    child
    parent
    进行比较,而是将
    tab[child]
    tab[parent]进行比较

    别忘了
    child
    只是存储二进制堆的数组的索引。这意味着,如果到达
    n
    第个元素,可以停止,因为最后一个元素已从树中删除


    你从来没有将
    孩子
    父母
    进行比较,而是将
    选项卡[孩子]
    选项卡[父母]
    进行比较!

    是的,我的错,我忘了包括这个:如果(选项卡[孩子]是的,这更有意义。但问题是,这是几年前的一次考试,所以我认为它是正确的代码。但可能确实是个错误。是的,我的错,我忘了包括这个:if(tab[儿童]是的,这更有意义。但问题是,这是几年前的一次考试,所以我认为它是正确的代码。虽然可能确实是一个错误。但是
    n=n-1
    是否意味着新的
    n
    第n个元素不是空的?首先(如果我们有11个节点),节点
    n
    (这将是索引11)是空的。但是在
    n=n-1
    之后,
    n
    现在是索引10,它不是空的吗?是的,你是对的,吉姆·米谢尔也是。这可能是一个错误,如果你删除行
    n=n-1;
    它应该可以正常工作,我没有看到那行。但是
    n=n-1
    一开始不意味着新的
    n
    第个元素不是空的吗(如果我们有11个节点,
    n
    (它应该是索引11)是空的。但是在
    n=n-1
    之后,
    n
    现在是索引10,它不是空的?是的,你是对的,吉姆·米谢尔也是。这可能是一个错误,如果你删除行
    n=n-1;
    它应该可以正常工作,我没有看到那一行。
    while(child<=n-1)
    
    while (child <= n)
    {
        if (child < n && tab[child] < tab[child+1])
        {
            child = child+1;
        }