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

C++でソートツリーをマージ


整数配列、セグメントの開始ポインタと終了ポインタのセット、およびキー値が与えられます。ここでの問題の説明は、指定されたキー値以下の指定された範囲内のすべての値を見つけることです。

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

入力 − arr [] ={7、8、1、4、6、8、10}

セグメント1:開始=2、終了=4、k =2

セグメント2:開始=1、終了=6、k =3

出力 −指定された範囲内のキー値以下の数のカウントは2 6

説明 − [8、1、4]は2から4の範囲を表し、2は範囲の2番目に小さい数値です[7、8、1、4、6、8]は1から6の範囲を表し、6は3番目です範囲内の最小数

入力 − arr [] ={2、7、9、4、6、5、1 |

セグメント1:開始=3、終了=6、k =4

セグメント2:開始=2、終了=5、k =3

出力 −指定された範囲内のキー値以下の数の数は次のとおりです。97

説明 − [9、4、6、5]は3から6の範囲を表し、9は指定された範囲の4番目に小さい数値です[7、9、4、6]は2から4の範囲を表し、7は3番目に小さい数値です指定されたセグメント範囲の番号

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

  • 整数型配列を宣言します。配列のサイズを計算します。整数型のペアを形成するベクトル型変数を宣言します。 FORループを開始して、データを配列からベクトルにプッシュします。

  • 指定されたベクトルを並べ替えます。 MAXサイズの整数型のベクトル配列を作成します。

  • 関数をgenerateTree(1、0、size -1、vec、tree)として呼び出し、getSmallestIndexをqueryWrapper(2、5、2、size、vec、tree)に設定します。

  • input[getSmallestIndex]を出力します。

  • getSmallestIndexを設定して、関数をqueryWrapper(1、6、4、size、vec、tree)として呼び出します。

  • 関数内でvoidgenerateTree(int treeIndex、int leftIndex、int rightIndex、vector >&a、vector tree [])

    • IF leftIndexをrightIndexにチェックしてから、settree [treeIndex] .push_back(a [leftIndex] .second)をチェックして、

      を返します。
    • midValueを(leftIndex + rightIndex)/ 2に設定し、generateTree(2 * treeIndex、leftIndex、midValue、a、tree)、generateTree(2 * treeIndex + 1、midValue + 1、rightIndex、a、tree)およびmerge(tree [2 * treeIndex] .begin()、tree [2 * treeIndex] .end()、tree [2 * treeIndex + 1] .begin()。set tree [2 * treeIndex + 1] .end()、back_inserter(tree [ treeIndex]))

  • 関数内でintcalculateKSmallest(int startIndex、int endIndex、int queryStart、int queryEnd、int treeIndex、int key、vector tree [])

    • IF startIndexをendIndexにチェックしてから、tree [treeIndex] [0]

      を返します。
    • midを(startIndex + endIndex)/ 2に設定し、last_in_query_rangeを(upper_bound(tree [2 * treeIndex] .begin()、tree [2 * treeIndex] .end()、queryEnd)-tree [2 * treeIndex] .begin( ))

    • first_in_query_rangeを(lower_bound(tree [2 * treeIndex] .begin()、tree [2 * treeIndex] .end()、queryStart)-tree [2 * treeIndex] .begin())に設定し、Mをlast_in_query_range --first_in_query_range

    • Mがキーと等しいかどうかを確認してからcalculateKSmallest(startIndex、mid、queryStart、queryEnd、2 * treeIndex、key、tree)を返します

    • ELSEの場合、calculateKSmallest(mid + 1、endIndex、queryStart、queryEnd、2 * treeIndex + 1、key --M、tree)を返します。

  • 関数内intqueryWrapper(int queryStart、int queryEnd、int key、int n、vector >&a、vector tree [])

    • 関数calculateKSmallest(0、n-1、queryStart-1、queryEnd-1、1、key、tree)への呼び出しを返します

#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
void generateTree(int treeIndex, int leftIndex, int rightIndex, vector<pair<int, int> > &a, vector<int> tree[]){
   if (leftIndex == rightIndex){
      tree[treeIndex].push_back(a[leftIndex].second);
      return;
   }
   int midValue = (leftIndex + rightIndex) / 2;
   generateTree(2 * treeIndex, leftIndex, midValue, a, tree);
   generateTree(2 * treeIndex + 1, midValue + 1, rightIndex, a, tree);
   merge(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), tree[2 * treeIndex + 1].begin(),
   tree[2 * treeIndex + 1].end(), back_inserter(tree[treeIndex]));
}
int calculateKSmallest(int startIndex, int endIndex, int queryStart, int queryEnd, int treeIndex, int key, vector<int> tree[]){
      if (startIndex == endIndex){
         return tree[treeIndex][0];
      }
      int mid = (startIndex + endIndex) / 2;
      int last_in_query_range = (upper_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(), queryEnd) - tree[2 * treeIndex].begin());
      int first_in_query_range = (lower_bound(tree[2 * treeIndex].begin(), tree[2 * treeIndex].end(),queryStart) - tree[2 * treeIndex].begin());
      int M = last_in_query_range - first_in_query_range;
      if (M >= key){
         return calculateKSmallest(startIndex, mid, queryStart, queryEnd, 2 * treeIndex, key, tree);
      }
      else {
         return calculateKSmallest(mid + 1, endIndex, queryStart,queryEnd, 2 * treeIndex + 1, key - M, tree);
      }
}
int queryWrapper(int queryStart, int queryEnd, int key, int n,
   vector<pair<int, int> > &a, vector<int> tree[]){
      return calculateKSmallest(0, n - 1, queryStart - 1, queryEnd - 1, 1, key, tree);
}
int main(){
   int input[] = { 7, 8 , 1, 4 , 6 , 8 , 10 };
   int size = sizeof(input)/sizeof(input[0]);
   vector<pair<int, int> > vec;
   for (int i = 0; i < size; i++) {
      vec.push_back(make_pair(input[i], i));
   }
   sort(vec.begin(), vec.end());
   vector<int> tree[MAX];
   generateTree(1, 0, size - 1, vec, tree);

   cout<<"Count of number which are smaller than or equal to key value in the given range are:"<<endl;

   int getSmallestIndex = queryWrapper(2, 4, 2, size, vec, tree);
   cout << input[getSmallestIndex] << endl;
   getSmallestIndex = queryWrapper(1, 6, 3, size, vec, tree);
   cout << input[getSmallestIndex] << endl;
   return 0;
}

出力

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

Count of number which are smaller than or equal to key value in the given range are:
4
6

  1. C++でツリーノードを削除する

    ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます- ノードの数はノードです i番目のノードの値はvalue[i] i番目のノードの親はparent[i] ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合- 7つのノードがあり、出力は2になります これを解決するには、次の手順に従います- 子供と呼ばれる地図を作成する dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます temp:=ペ

  2. C++での木の直径

    無向ツリーがあるとします。その直径を見つける必要があります-そのツリーの最長パスのエッジの数は、そのツリーの直径です。ここで、ツリーはエッジリストとして与えられます。ここで、edges [i] =[u、v]は、ノードuとvの間の双方向エッジです。各ノードには、セット{0、1、...、edges.length}にラベルがあります。したがって、グラフが次のような場合- 出力は4になります。 これを解決するには、次の手順に従います- マップを定義するl dfs()というメソッドを定義します。これには、v、visitedと呼ばれる配列、グラフ、およびcが必要です。次のように機能します-