C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

特定のバイナリツリーがC++でヒープであるかどうかを確認します


コンセプト

与えられた二分木に関して、それがヒーププロパティを持っているかどうかを確認する必要があります。二分木はヒープであるために次の2つの条件を満たす必要があります–

  • 二分木は完全なツリーである必要があります(つまり、最後を除くすべてのレベルがいっぱいである必要があります)。

  • 二分木のすべてのノードの値は、その子ノード以上である必要があります(最大ヒープを考慮)。

次の例に関して、このツリーにはヒーププロパティが含まれています–

特定のバイナリツリーがC++でヒープであるかどうかを確認します

次の例にはヒーププロパティがありません–

特定のバイナリツリーがC++でヒープであるかどうかを確認します

メソッド

完全性isComplete(この関数はバイナリツリーが完全であるかどうかをチェックします)を検証し、ヒープisHeapUtil関数が書き込まれることを検証するために、上記の各条件を個別に検証する必要があります。

isHeapUtil関数の記述に関して、次のことを考慮します–

  • すべてのノードは、2つの子、0の子(最終レベルのノード)または1つの子(最大で1つのそのようなノードが存在する可能性があります)を持つことができます。

  • ノードに子がないことが確認された場合、それはリーフノードであり、trueを返します(基本ケース)

  • ノードに子が1つあることがわかっている場合(完全なツリーであるため、子のままにする必要があります)、このノードを単一の子とのみ比較する必要があります。

  • ノードに両方の子があることがわかっている場合は、両方のサブツリーの繰り返しでノードのヒーププロパティを確認します。

/* C++ program to checks if a binary tree is max heap or not */
#include <bits/stdc++.h>
using namespace std;
struct Node1{
   int key;
   struct Node1 *left;
   struct Node1 *right;
};
struct Node1 *newNode(int k){
   struct Node1 *node1 = new Node1;
   node1->key = k;
   node1->right = node1->left = NULL;
   return node1;
}
unsigned int countNodes(struct Node1* root1){
   if (root1 == NULL)
      return (0);
   return (1 + countNodes(root1->left) + countNodes(root1->right));
}
bool isCompleteUtil (struct Node1* root1, unsigned int index1, unsigned int number_nodes){
   if (root1 == NULL)
      return (true);
   if (index1 >= number_nodes)
      return (false);
   // Recur for left and right subtrees
   return (isCompleteUtil(root1->left, 2*index1 + 1, number_nodes) && isCompleteUtil(root1->right, 2*index1 + 2, number_nodes));
}
bool isHeapUtil(struct Node1* root1){
   if (root1->left == NULL && root1->right == NULL)
      return (true);
   if (root1->right == NULL){
      return (root1->key >= root1->left->key);
   }
   else{
      if (root1->key >= root1->left->key &&
         root1->key >= root1->right->key)
      return ((isHeapUtil(root1->left)) &&
      (isHeapUtil(root1->right)));
      else
         return (false);
   }
}
bool isHeap(struct Node1* root1){
   unsigned int node_count = countNodes(root1);
   unsigned int index1 = 0;
   if (isCompleteUtil(root1, index1, node_count) &&
      isHeapUtil(root1))
   return true;
   return false;
}
// Driver program
int main(){
   struct Node1* root1 = NULL;
   root1 = newNode(10);
   root1->left = newNode(9);
   root1->right = newNode(8);
   root1->left->left = newNode(7);
   root1->left->right = newNode(6);
   root1->right->left = newNode(5);
   root1->right->right = newNode(4);
   root1->left->left->left = newNode(3);
   root1->left->left->right = newNode(2);
   root1->left->right->left = newNode(1);
   if (isHeap(root1))
      cout << "Given binary tree is a Heap\n";
   else
      cout << "Given binary tree is not a Heap\n";
   return 0;
}

出力

Given binary tree is a Heap

  1. バイナリツリーがC++でレベルごとにソートされているかどうかを確認します

    ここでは、二分木がレベルごとにソートされているかどうかを確認する方法を説明します。レベルごとにソートされた二分木は次のようになります- 各レベルでは、ノードは左から右に並べ替えられ、各レイヤーには前のレベルよりも高い値が含まれています。 レベル順序トラバーサルを実行することでこの問題を解決し、現在のレベルの最小要素と最大要素を追跡できます。別の変数prev_maxを使用して、前のレベルの最大値を保持します。次に、現在のレベルの最小値と前のレベルの最大値prev_maxを比較します。 min値がprev_maxより大きい場合、ツリーは現在のレベルまでレベルごとに並べ替えられます。次に、

  2. 特定のバイナリツリーがPythonのヒープであるかどうかを確認します

    二分木があるとしましょう。ヒープかどうかを確認する必要があります。ヒープには次のプロパティがあります。ヒープはバイナリツリーになります。そのツリーは完全なツリーである必要があります(つまり、最後を除くすべてのレベルがいっぱいである必要があります)。そのツリーのすべてのノード値は、その子ノード(max-heap)以上である必要があります。 したがって、入力が次のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 関数number_of_nodes()を定義します。これが定着します rootがnullの場合、 0を返す それ以外の場合、