我正在使用一个数组数据结构实现一个最小堆,但是我的moveDown方法有一个问题(在根节点使用,如果根节点的子节点比它小,就将集合返回到一个堆)。我假设读者知道什么是min heap,但是我将描述它以防有人不知道或者我的理解不正确。
最小堆(在这种情况下)是由数组表示的二叉树,这样:
我目前遇到的问题是,我的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
}
}
你重新声明你的变量。在 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的代码吗? 我认为我在上面选择了错误的样本值,人们对我真正想要的是什么感到困惑!!因此,将我的问题重新