C++ 二叉树中节点和的最大值,使得两个节点不相邻

在本教程中,我们将讨论一个程序来查找二进制树中节点的最大总和,这样没有两个相邻的节点使用动态编程。

为此,我们将提供一个二叉树。我们的任务是用动态规划方法找出子集的最大和,使子集中没有两个节点直接相连。

示例

#include <bits/stdc++.h>

using namespace std;

//用动态规划法求直径

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

以上是 C++ 二叉树中节点和的最大值,使得两个节点不相邻 的全部内容, 来源链接: utcz.com/z/350122.html

回到顶部