首先我将堆插入数组(根据Level order(又名广度优先)遍历), 现在我检查数组
For i = 1 to Len(Array) do:
IF 2 * i smaller than Len(Array):
IF Array[i] smaller than Array[2i] OR Array[i] larger than Array[2i+1]:
Return false
Else if 2 * i larger than Len(Array):
Return True
但我的问题是算法只有在树是一个完整的二叉树的情况下工作,如果不热我可以改进我的代码吗?
答案 0 :(得分:4)
Array[i] larger than Array[2i+1]
不应该检查相反:
Array[i] smaller than Array[2i+1]
我认为你有一个错误。
此外,您还有其他问题。
E.g。循环完成后“返回true”。
试试这个伪代码:
For i = 1 to Len(Array) do:
BEGIN
IF 2 * i + 1 <= Len(Array)
IF ( Array[i] smaller than Array[2i] ) OR ( Array[i] smaller than Array[2i+1]):
Return false
ELSE IF 2 * i <= Len(Array):
IF Array[i] smaller than Array[2i]:
Return false
ELSE:
break // break from the loop
END
RETURN TRUE;
答案 1 :(得分:2)
你可以找到左边的孩子:i * 2 + 1,右边的孩子有i * 2 + 2(如果你从i = 0开始)。
for(i=0; i< length; i++)
{
if((i*2+1) < length)
if(heap[i*2+1] > heap[i])
return false;
if((i*2+2) < length)
if(heap[i*2+2] > heap[i])
return false;
}
return true;
答案 2 :(得分:0)
如果您的数组基于索引1,则以下代码将起作用。也就是说,数组的第[0]个索引不包含堆数据,而是占位符。此方法有时用于与其他排序方法创建一致性。当然,这可以(也可能应该)作为一个单独的函数来实现。
for (int i = 1; i < (array.size() - 1); i++)
{
if ((2 * i) + 1 <= array.size() - 1) // if it has two children
{
if ((array[i] < array[2 * i]) || (array[i] < array[(2 * i) + 1]))
{
cout << "RETURNING FALSE" << endl;
return;
}
}
else if ((2 * i) <= array.size() - 1) //if it has only one child
{
if (array[i] < (array[(2 * i)]))
{
cout << "RETURNING FALSE2" << endl;
return;
}
}
}
cout << "IS A VALID HEAP.";