当前位置: 首页 > 知识库问答 >
问题:

通过二叉树的数组表示的最小堆;Move多谢函数无限循环

梁渊
2023-03-14

我正在使用一个数组数据结构实现一个最小堆,但是我的moveDown方法有一个问题(在根节点使用,如果根节点的子节点比它小,就将集合返回到一个堆)。我假设读者知道什么是min heap,但是我将描述它以防有人不知道或者我的理解不正确。

最小堆(在这种情况下)是由数组表示的二叉树,这样:

  1. 根节点是数据结构中的最小值
  2. 节点必须始终小于其子节点
  3. 给定一个数组索引I的节点,它的左子节点位于索引I*21,右子节点位于I*22

我目前遇到的问题是,我的move当下函数在交换时进入无限循环。我很难找到一个逻辑错误,所以我担心它可能更接近根(双关语,我情不自禁)。

heap.cpp文件中值得注意的数据成员:

int size;
MiniVector array;// The implementing custom array
void moveDown(int root);

我的heap.cpp文件中的moveDown函数:

void BinaryHeap::moveDown( int root ){

    int temp = root;
    int tempLC = temp*2 + 1;//LeftChild
    int tempRC = temp*2 + 2;//RightChild

    //Not a leaf
    while( ( tempLC < array.size() && tempRC < array.size() )
        &&
    ( (array[temp] > array[tempLC]) || (array[temp] > array[tempRC]) ) ){

        int hold = array[temp];

        if( array[temp] > array[tempRC] ){

            array[temp] = array[tempRC];
            array[tempRC] = hold;
            temp = tempRC;
        }

        else{

            array[temp] = array[tempLC];
            array[tempLC] = hold;
            temp = tempLC;
        }

        int tempLC = temp*2 + 1;//LeftChild
        int tempRC = temp*2 + 2;//RightChild
    }
}

共有1个答案

壤驷高旻
2023-03-14

你重新声明你的变量。在 while 循环的底部

    int tempLC = temp*2 + 1;//LeftChild
    int tempRC = temp*2 + 2;//RightChild

应该是

    tempLC = temp*2 + 1;//LeftChild
    tempRC = temp*2 + 2;//RightChild

不会发生在Java。

如果你把你的循环重写为一个中间有断点的无限for循环,也不会发生这种情况

for (;;)
{
    int tempLC = temp*2 + 1;//LeftChild
    int tempRC = temp*2 + 2;//RightChild
    if (...)
        break;
    ...
}

但是每当我建议这种循环是个好主意时,我都会感到愤怒。上次有人建议这几乎是一种反模式,这是一种更礼貌的回答。

 类似资料:
  • 很长一段时间以来,我一直在解决这项任务。我需要编写一个递归函数来检查每个节点是否小于其任何子节点。如果二叉树是最小堆,则返回 true,否则返回 false。 到目前为止我所拥有的:

  • 给定一棵树,其中左和右子树是min堆,但根节点不维护min堆属性。您的代码应该修改根植于node*n的树,使其成为一个最小堆。(这意味着您需要满足min heap属性:节点的值等于它的一个子节点或两个子节点都是可以的,但节点的值不能大于它的任何一个子节点。您不必试图平衡树或使其成为完整的树。) 请建议我缺少什么。我觉得我把它弄得太复杂了。此外,我没有任何其他函数,如swap将二叉树转换为堆MIN。

  • 使用基于数组的二叉树实现,而不是旧的基于节点的实现,在速度/空间/总体性能方面有什么好处吗?我知道对基于数组的树进行旋转或任何其他复杂的修改都是可怕的,但是在简单的二叉树实现的情况下,你会说通过数组实现会更好吗?

  • 我有类BinaryTreeNode(int值)及其左子级和右子级,BinaryTree(int rootVal)具有BinaryTreeNode根,rootVal作为其值。我开发了一个代码来计算树中的节点数(在类BinaryTreeNode中),但由于NullPointerException,它不起作用: 然而,我发现了另一个具有类似策略的解决方案: 我已经理解了为什么我的代码会抛出异常(因为le

  • 我正在读二叉树。在练习编码问题时,我遇到了一些解决方案,其中要求找到二叉树的最小深度。现在根据我的理解,深度是从根到节点的边数(叶节点的情况下为叶节点/二叉树) 二叉树{1,2}的最小深度是多少 根据我的解决方案,应该是1。

  • 我在阅读下面的帖子后提出这个问题: 如何找到树的最小可能高度? 实际上,如果给二叉树的输入如下:100,50,70,60,我希望我的算法返回4。 但是下面的代码只返回1,因为它不区分叶[left==NULL] 没有人解释过如果我们希望输出为4而不是1,我们应该做什么。 有人能给我看看返回4而不是1的代码吗? 我认为我在上面选择了错误的样本值,人们对我真正想要的是什么感到困惑!!因此,将我的问题重新