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

C++プログラムの動的計画法を使用して2つが隣接しないようなバイナリツリーのノードの最大合計


この問題では、各ノードに値を持つバイナリツリーが与えられます。私たちのタスクは、2つが隣接しないようにバイナリツリー内のノードの最大合計を見つけるプログラムを作成することです。動的計画法を使用します。

問題の説明 −ノードが直接接続されないように合計が最大になるように、バイナリツリーのサブセットを選択します。

問題を理解するために例を見てみましょう

入力

C++プログラムの動的計画法を使用して2つが隣接しないようなバイナリツリーのノードの最大合計

出力

24

説明

Elements to be taken under consideration are:
8 + 5 + 9 + 2 = 24

ソリューションアプローチ

この問題の解決策は、マップを使用して、ノードがmaxSumを形成するようにノードの合計を見つけることです。ノードとその子の両方を使用することはできません

与えられた条件に従って合計を考慮します。したがって、ノードを検討する前に、その子ツリーに、より大きな合計を構成する要素が含まれているかどうかを確認する必要があるという事実を確認する必要があります。

各ノードで同じ親子サブツリーの合計を複数回見つけると、計算のオーバーヘッドが増加します。これを処理するために、記憶を使用して、後で使用できるマップ内のノードまでmaxSumを格納します。

ソリューションの動作を説明するプログラム

#include <bits/stdc++.h>
using namespace std;
struct node{
   int data;
   struct node *left, *right;
};
struct node* newNode(int data){
   struct node *temp = new struct node;
   temp−>data = data;
   temp−>left = temp−>right = NULL;
   return temp;
}
int findMaxSumBT(node* node, map<struct node*, int>& nodeSum);
int sumSubTreeNodes(node* node, map<struct node*, int>& nodeSum){
   int maxSum = 0;
   if (node−>left)
      maxSum += findMaxSumBT(node−>left−>left, nodeSum) +
   findMaxSumBT(node−>left−>right, nodeSum);
   if (node−>right)
      maxSum += findMaxSumBT(node−>right−>left, nodeSum) +
   findMaxSumBT(node−>right−>right, nodeSum);
   return maxSum;
}
int findMaxSumBT(node* node, map<struct node*, int>& nodeSum){
   if (node == NULL)
   return 0;
   if (nodeSum.find(node) != nodeSum.end())
   return nodeSum[node];
   int sumInclCurr = node−>data + sumSubTreeNodes(node, nodeSum);
   int sumExclCurr = findMaxSumBT(node−>left, nodeSum) +
   findMaxSumBT(node−>right, nodeSum);
   nodeSum[node] = max(sumInclCurr, sumExclCurr);
   return nodeSum[node];
}
int main(){
   node* root = newNode(9);
   root−>left = newNode(4);
   root−>right = newNode(7);
   root−>left−>left = newNode(8);
   root−>left−>right = newNode(5);
   root−>right−>left = newNode(2);
   map<struct node*, int> nodeSum;
   cout<<"Maximum sum of nodes in Binary tree such that no two are
   adjacent using Dynamic Programming is "<<findMaxSumBT(root,
   nodeSum);
   return 0;
}

出力

Maximum sum of nodes in Binary tree such that no two are adjacent using
Dynamic Programming is 24

  1. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ

  2. C++を使用してツリーの奇数レベルでノードを印刷するプログラム

    このチュートリアルでは、特定の二分木の奇数レベルに存在するノードを印刷するプログラムについて説明します。 このプログラムでは、ルートノードのレベルは1と見なされ、同時に代替レベルは次の奇数レベルになります。 たとえば、次の二分木が与えられているとしましょう この場合、この二分木の奇数レベルのノードは1、4、5、6になります。 例 #include <bits/stdc++.h> using namespace std; struct Node {    int data;    Node* left, *right; }; //p