2016-07-28 7 views
6

私は以下の配列を持っています。 n要素を含む配列が分のヒープであるかどうかを確認するにはどうすればよいですか? enter image description here配列が最小ヒープであるかどうかをチェックする方法?

+0

http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heapこれを参照してください。 –

+2

['std :: is_heap'](http://en.cppreference.com/w/cpp/algorithm/is_heap)をお探しですか? –

+0

ノードiの子は2iと2i + 1にあります。したがって、ヒーププロパティであるため、[2i] = a [i]とa [2i + 1]> a [i]を検証します。 – Gene

答えて

5

あなたのインデックスが(インデックス0は0が含まれている - なぜ?)、1から始まるので、以下のように、あなたが与えられたノードの子のインデックスを決定することができます

  • 指定されたノードのインデックスをしてみましょう':i2i
  • インデックスの左の子年代右の子:2i + 1
i
  • ランキング

    したがって、ノードごとに、両方の子がノード自体よりも大きいかどうかを簡単に確認できます。

  • +1

    一部の人は、インデックス1にルートを置くことを好む人もいます。それはパフォーマンス上の理由からです(左の子を計算するときに余分な追加を省き、親を計算するときに減算を削除します)。差。欠点は、Cのような言語プログラマーの間で、未知のフェンスポストエラーを引き起こすことです。私は、Sedgewickが1983年にAlgorithmsの本を書いていて、彼のすべての例がPascalで、1ベースの配列を持っていたからです。彼のパスカルの例のC言語の翻訳は今日でも普及しています。 –

    3

    is_heapです。あなたはちょうど適切なコンパレータを使用する必要があります。そして、あなたにも楽に、イテレータを使用して1ベースのインデックスとそれを使用することができます。

    #include <iostream> 
    #include <algorithm> 
    #include <vector> 
    #include <functional> 
    
    int main() 
    { 
        std::vector<int> v {0, 5, 9, 11, 14, 18, 19 }; 
        std::cout << std::is_heap(
         v.begin()+1, // off by 1 
         v.end(), 
         std::greater<int>() // std::less is used by default for max-heap 
        ); 
    } 
    
    0

    おなじみの幅優先探索(BFS)もツリーが最小/最大ヒープであるかどうかをチェックするために適用することができます。

    #include <iostream> 
    #include <queue> 
    
    int main() { 
        int tree[] = {5, 9, 11, 14, 18, 19, 21, 33, 17, 27}; 
        int size = 10; 
        std::queue <int> q; 
        q.push(0); 
        bool flag = true; 
        while(!q.empty()) { 
         int x = q.front(); 
         q.pop(); 
         int left = 2*x+1, right = 2*x+2; // 0-based indexing used here 
         if(left < size) { // check if left child exists or not. 
          q.push(left); 
          // check value at parent is less than child or not. 
          if(tree[x] > tree[left]) { 
           flag = false; 
           break; 
          } 
         } 
         if(right < size) { // check whether right child exists or not. 
          q.push(right); 
          if(tree[x] > tree[right]) { // check value of parent less than child. 
           flag = false; 
           break; 
          } 
         } 
        } 
        if(flag) 
         std::cout << "It is minimum heap.\n"; 
        else 
         std::cout << "Not a minimum heap.\n"; 
        return 0; 
    } 
    

    考え方はwookie919と同じです。

    関連する問題