尝试检查树是否是最大堆

时间:2013-12-12 22:41:02

标签: algorithm tree binary-tree pseudocode

首先我将堆插入数组(根据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

但我的问题是算法只有在树是一个完整的二叉树的情况下工作,如果不热我可以改进我的代码吗?

3 个答案:

答案 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.";