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

C++で指定された範囲にあるBSTサブツリーをカウントします


入力として二分探索木が与えられます。目標は、開始と終了の範囲の間にノード値を持つBSTのサブツリーの数を見つけることです。 startが5で、endが50の場合。次に、すべてのノードの重みが5以上50未満のBSTのサブツリーをカウントします。

入力 −以下に示すツリー−範囲[3-6]

C++で指定された範囲にあるBSTサブツリーをカウントします

出力 −範囲内にある木の数− 2

説明 −ノード4および6の場合のみ。それらのサブツリー(NULL)は3〜6の間にあります。

入力 −以下に示すツリー:範囲[12-20]

C++で指定された範囲にあるBSTサブツリーをカウントします

出力 −範囲内にある木の数− 3

説明 −ノード16、14、および20の場合。それらのサブツリーは12〜20の間にあります。

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

  • 構造Btreenodeは、ツリーのノードを作成するために使用されます。情報部分は整数であり、サブツリーを指すための左右のポインターを自己参照します。

  • 関数Btreenode*insert(int data)は、データをinfoとして、左右のポインターをNULLとしてノードを作成するために使用されます。

  • 特定の構造に対して挿入関数を呼び出して、BSTを作成します。ルートノードに右からノードを追加するには(root-> right =insert(70);)、ルートの左側にノードを追加します(root-> left =insert(30);)。

  • 変数lとhは、範囲の最小値と最大値を格納するために使用されます。

  • 可変カウントは、lからhの範囲にあるツリー内のBSTのカウントを格納します。最初は0です。

  • 関数getBtreeCount(Btreenode * root、int low、int high、int * count)は、BSTのルート、範囲の左右の境界、およびカウントのアドレスをパラメーターとして受け取り、各再帰呼び出しのカウントの値を更新します。

  • 現在のルートについては、NULLかどうかを確認し、NULLの場合は、ツリーの一部ではないため1を返します。

  • 現在のノードについては、その左右のサブツリーノードがすべて指定された範囲内にあるかどうかを確認します。再帰呼び出しによってgetBtreeCount(root-> left、low、high、count); andgetBtreeCount(root-> right、low、high、count);

  • 両方のサブツリーが範囲内にあり、現在のノードも範囲内にある場合、現在のノードをルートとするツリーは範囲内にあります。インクリメントカウント。 if(left &&right &&root-> info> =low &&root-> info <=high)and ++ * count; 1を返します。

  • 最後に、カウントはすべてのサブツリーのカウントとして更新された値になります。

  • 結果をカウントで印刷します。

#include <bits/stdc++.h>
using namespace std;
// A BST node
struct Btreenode {
   int info;
   Btreenode *left, *right;
};
int getBtreeCount(Btreenode* root, int low, int high, int* count){
   // Base case
   if (root == NULL)
      return 1;
      int left = getBtreeCount(root->left, low, high, count);
      int right = getBtreeCount(root->right, low, high, count);
      if (left && right && root->info >= low && root->info <= high) {
         ++*count;
      return 1;
   }
   return 0;
}
Btreenode* insert(int data){
   Btreenode* temp = new Btreenode;
   temp->info = data;
   temp->left = temp->right = NULL;
   return (temp);
}
int main(){
      /* BST for input
         50
        / \
       30 70
      / \ / \
20 40 60 80 */
   Btreenode* root = insert(50);
   root->left = insert(30);
   root->right = insert(70);
   root->left->left = insert(20);
   root->left->right= insert(40);
   root->right->left = insert(60);
   root->right->right = insert(80);
   int l = 10;
   int h = 50;
   int count=0;
   getBtreeCount(root, l, h, &count);
   cout << "Count of subtrees lying in range: " <<count;
   return 0;
}

出力

Count of subtrees lying in range: 3

  1. C++でUnivalueサブツリーをカウントする

    二分木があるとしましょう。単一値のサブツリーの数を数える必要があります。ここで、単一値サブツリーは、サブツリーのすべてのノードが同じ値を持っていることを示しています。 したがって、入力がroot =[5,1,5,5,5、null、5]、のような場合 その場合、出力は4になります これを解決するには、次の手順に従います- 関数solve()を定義します。これはノードを取ります ノードが空の場合、- trueを返す 左:=solve(ノードの左側) 右:=ソルブ(ノードの右) 左が偽または右が偽の場合、- falseを返す ノード

  2. C++の特定の範囲にあるBSTノードをカウントします

    ノードと範囲で構成される二分探索木が与えられます。タスクは、指定された範囲内にあるノードの数を計算し、結果を表示することです。 二分探索木(BST)は、すべてのノードが以下のプロパティに従うツリーです- ノードの左側のサブツリーには、その親ノードのキー以下のキーがあります。 ノードの右側のサブツリーには、その親ノードのキーよりも大きいキーがあります。 したがって、BSTはすべてのサブツリーを2つのセグメントに分割します。左側のサブツリーと右側のサブツリーで、次のように定義できます- left_subtree(キー)≤node(キー)≤right_subtree(キー) 例