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

2つが隣接しないような二分木のノードの最大合計| C++での動的計画法


このチュートリアルでは、動的計画法を使用して2つが隣接しないように、バイナリツリー内のノードの最大合計を見つけるプログラムについて説明します。

このために、バイナリツリーが提供されます。私たちのタスクは、動的計画法を使用してサブセット内の2つのノードが直接接続されないように、合計が最大のサブセットを見つけることです。

#include <bits/stdc++.h>
using namespace std;
//finding diameter using dynamic programming
void dfs(int node, int parent, int dp1[], int dp2[], list<int>* adj, int tree[]){
   int sum1 = 0, sum2 = 0;
   for (auto i = adj[node].begin(); i != adj[node].end();
      ++i) {
         if (*i == parent)
            continue;
         dfs(*i, node, dp1, dp2, adj, tree);
         sum1 += dp2[*i];
         sum2 += max(dp1[*i], dp2[*i]);
      }
      dp1[node] = tree[node] + sum1;
      dp2[node] = sum2;
}
int main() {
   int n = 5;
   list<int>* adj = new list<int>[n + 1];
   adj[1].push_back(2);
   adj[2].push_back(1);
   adj[1].push_back(3);
   adj[3].push_back(1);
   adj[2].push_back(4);
   adj[4].push_back(2);
   adj[2].push_back(5);
   adj[5].push_back(2);
   int tree[n + 1];
   tree[1] = 10;
   tree[2] = 5;
   tree[3] = 11;
   tree[4] = 6;
   tree[5] = 8;
   int dp1[n + 1], dp2[n + 1];
   memset(dp1, 0, sizeof dp1);
   memset(dp2, 0, sizeof dp2);
   dfs(1, 1, dp1, dp2, adj, tree);
   cout << "Maximum sum: " << max(dp1[1], dp2[1]) << endl;
   return 0;
}

出力

Maximum sum: 25

  1. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace

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

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