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

C++でツリーの任意の2つの頂点間の度の積の合計を最大化します


与えられた整数Nでツリーを構築することがタスクであるとすると、すべての順序対(x、y)の度(x)*度(y)の合計が最大になります。 xはyと等しくありません。

入力 −n =5

出力 −50

説明

   1
    \
     2
      \
       3
         \
          4
            \
             5
Degree of 1st node = 1
Degree of 2nd node = 2
Degree of 3rd node = 2
Degree of 4th node = 2
Degree of 5th node = 1

すべての順序対(x、y)のすべての度の積-

1st node = 1*2 + 1*2 + 1*2 + 1*1 = 7
2nd node = 2*1 + 2*2 + 2*2 + 2*1 = 12
3rd node = 2*1 + 2*2 + 2*2 + 2*1 = 12
4th node = 2*1 + 2*2 + 2*2 + 2*1 = 12
5th node = 1*2 + 1*2 + 1*2 + 1*1 = 7
Total sum = 50

入力 −n =7

出力 −122

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

  • ツリー内のすべてのノードの次数の合計は、−(2 * N)– 2です。ここで、N=ツリー内のノードの数です。合計を最大化するには、リーフノードの数を最小化する必要があります。

  • Max()関数内で、int sum =0を初期化し、条件x

  • ネストされたループ内で、最初にif(x ==y)をチェックし、そうであれば、続行を追加します。ステートメント

  • それ以外の場合は、intdegree =2を初期化し、ifステートメントを使用してif(x ==1 || x ==n)をチェックします。もしそうなら、degreeX=1を置きます。次に、intdegree =2を初期化し、変数y

    に対して同じことを行います。
  • 最後に、ループを閉じる前に、次のように合計変数を更新します。− sum =(degreeX +degreeY)

#include <bits/stdc++.h>
using namespace std;
int Max(int N){
   int sum = 0;
   for (int x = 1; x <= N; x++){
      for (int y = 1; y <= N; y++){
         if (x == y)
            continue;
         //Initializing degree for node x to 2
         int degreeX = 2;
         //If x is the leaf node or the root node
         if (x == 1 || x == N)
            degreeX = 1;
         //Initializing degree for node y to 2
         int degreeY = 2;
         //If y is the leaf node or the root node
         if (y == 1 || y == N)
            degreeY = 1;
         //Updating sum
         sum += (degreeX * degreeY);
      }
   }
   return sum;
}
//Main function
int main(){
   int N = 5;
   cout << Max(N);
}

出力

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

50

  1. C++の二分木で最も近い葉を見つけます

    1つの二分木が与えられたとします。さまざまなレベルのリーフノードがあります。ノードを指す別のポインターが与えられます。尖ったノードから最も近いリーフノードまでの距離を見つける必要があります。ツリーが以下のようであると考えてください- ここで、リーフノードは2、-2、および6です。ポインタがノード-5を指している場合、-5から最も近いノードは距離1になります。 これを解決するために、指定されたノードをルートとするサブツリーをトラバースし、サブツリー内で最も近いリーフを見つけて、距離を保存します。ここで、ルートからツリーをトラバースします。ノードxが左側のサブツリーに存在する場合は、右側

  2. C++プログラミングのバイナリツリー内の任意の2つのノード間のパスを出力します。

    個別のノードのバイナリツリーと、バイナリツリー内のパスを出力するバイナリツリーの2つのノードが与えられます。 例 −ノード140から211の間のパスを出力して、その出力が次のようになるようにします- Output: 140->3->10->211 アイデアは、ルートノードから2つのノードへのパスを見つけて、それらを2つの別々のベクトルまたは配列(path1とpath2など)に格納することです。 ここで、2つの異なるケースが発生します- 2つのノードがルートノードの異なるサブツリーにある場合 − 2つのノードが、1つが左に、もう1つが右のように異なるサブツリーにあ