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

最小数C++のツリー内のすべてのノードに情報を渡すための反復回数


「n」個のノードを持つツリーデータ構造が与えられます。指定されたツリーにはルートノードとそれぞれの子があり、それぞれの子は任意の数であり、さらに子は任意の数の子を持つことができます。タスクは、ツリーのルートノードがツリー内のすべてのノードに情報を渡すために必要な最小反復回数を見つけることです。一度に、ノードはその子の1つに情報を渡すことができ、さらにその子の1つはその子の1つに情報を渡すことができ、その間、ルートノードは別の子に情報を渡すことができます。

このためのさまざまな入出力シナリオを見てみましょう-

で-

最小数C++のツリー内のすべてのノードに情報を渡すための反復回数

アウト- 最小数ツリー内のすべてのノードに情報を渡すための反復回数は次のとおりです。5

説明- ルートと他のすべてのノードを含む合計11個のノードを持つツリーが与えられます。特定のツリーのルートノードは0です。これは、多くの子があり、次に他のノードがあるため、最初にノード1にデータを渡します。次に、ルートノードはノード4にデータを渡し、次に3にデータを渡し、次に渡します。データを6に、最後にデータを2に渡します。したがって、必要な反復は合計で5です。

で-

最小数C++のツリー内のすべてのノードに情報を渡すための反復回数

アウト- 最小数ツリー内のすべてのノードに情報を渡すための反復回数は次のとおりです。1

説明- :ルートと他のすべてのノードを含む合計2つのノードを持つツリーが与えられます。特定のツリーにはルートノードの子が1つしかないため、必要な反復の最小数は1になります。

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

  • ツリーを構築するクラスを作成し、そのデータメンバーとしてノードを追加し、List_childrenとしてリストポインターを作成し、void Iteration(int vertices、int arr [])としてプライベートメソッドを宣言します。パラメータ化されたコンストラクタをTree(intノード)、void insert_node(int a、int b)、int Min_Iteration()、およびstatic int check(const void * a_1、const void * b_1)として宣言します。

  • 外部のパラメーター化されたコンストラクターをTree::Tree(intノード)

    として呼び出します。
    • this->nodesをnodesに設定します。

    • List_childrenを新しいlist[nodes]

      に設定します
  • クラスメソッドをvoidTree::insert_node(int a、int b)

    として呼び出します。
    • List_children [a]をpush_back(b)に設定します

  • クラスメソッドをvoidTree::Iteration(int vertices、int arr [])

    として呼び出します。
    • arr[vertices]をList_children[vertices].size()

      に設定します
    • *ptrをnewint[arr [vertices]]

      に設定します
    • tempを0に、temp_2を0に設定します

    • イテレータをlist::iterator it

      として宣言します
    • それからList_children[vertices].begin()へのループFORを開始し、List_children [vertices] .end()と等しくならないようにして、事前にインクリメントします。ループ内でIteration(* it、arr)を設定し、ptr[temp++]をarr[*it]

      に設定します。
    • クイックソートを行うには、qsort(ptr、arr [vertices]、sizeof(int)、check)を呼び出します

    • ループFORtempを0に開始し、tempをList_children [vertices] .size()未満にして、増分tempをポストします。ループ内で、temp_2をptr [temp] + temp + 1に設定し、arr [vertices]をmax(arr [vertices]、temp_2)に設定し、delete [] ptr

  • クラスメソッドをintTree::Min_Iteration()

    として呼び出します。
    • ポインタをint*ptr =new int [nodes]

      として宣言します
    • 変数をinttemp=-1

      として宣言します
    • i<ノードおよびi++まで、ループFORをiから0まで開始します。ループ内で、ptr[i]を0に設定します

    • Iteration(0、ptr)を呼び出し、tempをptr[0]に設定してdelete[] ptr

    • 温度を返す

  • クラスメソッドをintTree::check(const void * a_1、const void * b_1)

    として呼び出します。
    • 変数をintの結果として(*(int *)b_1-*(int *)a_1)

      に宣言します
    • 結果を返す

  • main()関数内

    • パラメータ化されたコンストラクタを使用してツリーオブジェクトを作成します。

    • 次に、ツリークラスのオブジェクトを使用して、insert_node()メソッドを呼び出し、ノードデータをツリーに挿入します

    • Min_Iteration()メソッドを呼び出して、ツリー内のすべてのノードに情報を渡すための最小反復回数を計算します

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

class Tree
{
   int nodes;
   list<int> *List_children;
   void Iteration(int vertices, int arr[]);

public:
   //constructor of a class
   Tree(int nodes);
   //method to insert a node in a tree
   void insert_node(int a, int b);
   //method to calculate the minimum iterations
   int Min_Iteration();
   static int check(const void *a_1, const void *b_1);
};

Tree::Tree(int nodes)
{
   this->nodes = nodes;
   List_children = new list<int>[nodes];
}
void Tree::insert_node(int a, int b)
{
   List_children[a].push_back(b);
}
void Tree::Iteration(int vertices, int arr[])
{
   arr[vertices] = List_children[vertices].size();
   int *ptr = new int[arr[vertices]];
   int temp = 0;
   int temp_2 = 0;
   list<int>::iterator it;

   for(it = List_children[vertices].begin(); it!= List_children[vertices].end(); ++it)
   {
      Iteration(*it, arr);
      ptr[temp++] = arr[*it];
   }

   qsort(ptr, arr[vertices], sizeof(int), check);

   for(temp = 0; temp < List_children[vertices].size(); temp++)
   {
      temp_2 = ptr[temp] + temp + 1;
      arr[vertices] = max(arr[vertices], temp_2);
   }
   delete[] ptr;
}
int Tree::Min_Iteration()
{
   int *ptr = new int[nodes];
   int temp = -1;

   for (int i = 0; i < nodes; i++)
   {
      ptr[i] = 0;
   }
   Iteration(0, ptr);
   temp = ptr[0];
   delete[] ptr;
   return temp;
}
int Tree::check(const void * a_1, const void * b_1)
{
}
int main()
{
   Tree T_1(8);
   T_1.insert_node(0, 1);
   T_1.insert_node(0, 3);
   T_1.insert_node(0, 4);
   T_1.insert_node(0, 6);
   T_1.insert_node(0, 2);
   T_1.insert_node(1, 7);
   T_1.insert_node(1, 2);
   T_1.insert_node(1, 3);
   T_1.insert_node(4, 6);
   T_1.insert_node(4, 7);
   cout<<"Minimum no. of iterations to pass information to all nodes in the tree are:"<<T_1.Min_Iteration();

   Tree T_2(2);
   T_2.insert_node(0, 1);
   cout<<"\nMinimum no. of iterations to pass information to all nodes in the tree are:" <<T_1.Min_Iteration();

   return 0;
}

出力

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

Minimum no. of iterations to pass information to all nodes in the tree are: 8
Minimum no. of iterations to pass information to all nodes in the tree are: 8

  1. C++で奇数と偶数のノードを含むすべてのレベルを出力します

    この問題では、ツリーが与えられます。そして、偶数のノードと奇数のノードを含むすべてのレベルを印刷する必要があります。 概念をよりよく理解するために例を見てみましょう 出力- Levels with odd number of nodes: 1, 3, 4 Levels with even number of nodes: 2 説明 −第1レベルには1つの要素(奇数)、第2レベルには2つの要素(偶数)、第3レベルには3つの要素(奇数)、第4レベルには1つの要素(偶数)が含まれます。 さて、この問題を解決するために。各レベルでノードの数を見つけ、それに応じて偶数-奇数レベルを出力す

  2. C++で与えられた完全な二分木のすべてのノードの合計を見つけます

    完全な二分木のレベル数を表す正の整数Lがあるとします。この完全な二分木のリーフノードには、1からnまでの番号が付けられています。ここで、nはリーフノードの数です。親ノードは子の合計です。私たちの仕事は、この完璧な二分木のすべてのノードの合計を出力するプログラムを書くことです。したがって、ツリーが以下のようになっている場合- したがって、合計は30です。 よく見ると、すべてのノードの合計を見つける必要があります。リーフノードは1からnまでの値を保持しているため、式n(n + 1)/2を使用してリーフノードの合計を取得できます。これは完全な二分木であるため、各レベルの合計は同じになります