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

C ++でBFSを使用して、ツリー内の特定のレベルのノードの数をカウントします


ツリーのノードを頂点として含む無向グラフが与えられます。目標は、BFS(幅優先探索)アルゴリズムを使用して、ツリーの特定のレベルでノードの数を見つけることです。

BFSアルゴリズム:-

このアルゴリズムは、レベルごとにグラフ/ツリーのトラバースを開始します。レベル0のノードから開始して、最初にレベル1でノードに直接接続されているすべてのノードをトラバースし、次に次のレベルのすべてのノードをトラバースします。

  • 現在のレベルでノードを水平方向にトラバースします。
  • 同様の方法で次のレベルのノードをトラバースします。

例を挙げて理解しましょう。

入力- level =2

C ++でBFSを使用して、ツリー内の特定のレベルのノードの数をカウントします

出力- BFSを使用したツリー内の特定のレベルのノード数は次のとおりです。1

説明- 上に示したように、すべてのレベルのグラフに単一のノードがあります。

入力- level =1

C ++でBFSを使用して、ツリー内の特定のレベルのノードの数をカウントします

出力- BFSを使用したツリー内の特定のレベルのノード数は次のとおりです。2

説明- 上に示したように、すべてのレベルのグラフに単一のノードがあります。ノードは1、2です。

以下のプログラムで使用されているアプローチは次のとおりです

このアプローチでは、各ノードをトラバースし、それらのレベルをその親より1レベル高く設定します。隣接リスト表現を使用してグラフを表現します。

開始ノードが0の場合、

level [0] =0、

level [1] =level [0] +1 =1、level [2] =level [0] + 1 =1

level [3] =level [2] +1 =2、level [4] =level [2] + 1 =2

C ++でBFSを使用して、ツリー内の特定のレベルのノードの数をカウントします

  • 頂点の数としてデータを使用し、隣接リストへのポインタとして次のデータを使用して、グラフを表すクラスノードを作成します。
  • パブリックメソッドinsert(int val、int point)は、グラフにエッジを追加します。
  • ポイントの隣接リストにvalを追加し、valの隣接リストをポイントします。
  • 関数count_nodes(int a、int b)は、ソースノードaから始まるレベルbのノードの数を返します。
  • 初期カウントを0に設定します。
  • bool array check =newbool[data]を実行します。
  • Array arr [data]は、グラフの各頂点のレベルを格納します。
  • forループを使用して、グラフのすべての頂点を非訪問として設定し、check [i]=falseおよびarr[i]=0に設定します。
  • BFSトラバーサル用のキューl1を作成します。
  • 開始した頂点をcheck[a]=trueとしてマークし、l1.push_back(a)を使用してl1に追加し、そのレベルを0に設定します。arr[a]=0。
  • キューl1が空ではない間。
  • 前の要素をa=l1とします。 front()を使用して、l1.pop_front()を使用して出力します。
  • の隣接するすべての未訪問の頂点を訪問済みとしてマークし、キューl1に追加します。
  • 隣接する各頂点のレベルを+1のレベルとして設定します。
  • whileループの最後に、forループと各arr [i]==b増分カウントを使用してarr[]をトラバースします。
  • 結果としての最終返品カウント

#include <bits/stdc++.h>
using namespace std;

class node {
   int data;
   list < int > * next;
   public:
      node(int data) {
         this -> data = data;
         next = new list < int > [data];
      }
   void insert(int val, int point) {
      next[val].push_back(point);
      next[point].push_back(val);
   }
   int count_nodes(int a, int b);
};

int node::count_nodes(int a, int b) {
   int count = 0;
   bool * check = new bool[data];
   int arr[data];

   for (int i = 0; i < data; i++) {
      check[i] = false;
      arr[i] = 0;
   }

   list < int > l1;
   check[a] = true;
   l1.push_back(a);
   arr[a] = 0;

   while (!l1.empty()) {
      a = l1.front();
      l1.pop_front();
      for (auto it = next[a].begin(); it != next[a].end(); ++it) {
         if (!check[ * it]) {
            arr[ * it] = arr[a] + 1;
            check[ * it] = true;
            l1.push_back( * it);
         }
      }
   }
   for (int i = 0; i < data; i++) {
      if (arr[i] == b) {
         count++;
      }
   }
   return count;
}
int main() {
   node n1(5);
   n1.insert(1, 2);
   n1.insert(0, 3);
   n1.insert(1, 3);
   n1.insert(2, 4);

   int level = 1;

   cout << "Count of number of nodes at given level in a tree using BFS are: " << n1.count_nodes(0, level);
   return 0;
}

上記のコードを実行すると、次の出力が生成されます-

出力

Count of number of nodes at given level in a tree using BFS are: 1

  1. C ++を使用してOpenCVの面の数を数える方法は?

    画像内にある顔の数を数えるのは簡単です。前のセクションで作成したプログラムには、「faces.size()」の面の数に関する情報がすでに含まれています。このコード-faces.size()は整数値を与えます。 たとえば、「int x =faces.size()」と書くと、「x」には面の数が含まれます。 次のプログラムは、特定の画像から顔の数を計算し、コンソールウィンドウに表示します。 例 #include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/objdetect/obj

  2. C++で重みが2の累乗である特定のツリー内のノードをカウントします

    ノードの重みを持つ二分木が与えられます。目標は、数が2の累乗になるような重みを持つノードの数を見つけることです。重みが32の場合は25なので、このノードがカウントされます。 例 入力 値を入力した後に作成されるツリーを以下に示します- 出力 Count the nodes in the given tree whose weight is a power of two are: 3 説明 we are given with the tree node and the weights associated with each node. Now we calculate the po