C++のツリーで最大のサブツリーの合計を検索します
この問題では、二分木が与えられます。私たちのタスクは、ツリー内で最大のサブツリーの合計を見つけることです。
問題の説明: 二分木は、正の値と負の値で構成されます。そして、ノードの合計が最大のサブツリーを見つける必要があります。
問題を理解するために例を見てみましょう。
出力: 13
説明:
左サブツリーの合計は7です
右サブツリーの合計は1です
ツリーの合計は13です
ソリューションアプローチ
この問題を解決するために、ポストオーダートラバーサルを実行します。ノードの左側のサブツリーと右側のサブツリーの合計を計算します。現在のノードについて、現在のノードのノードの合計が左または右のサブツリーの合計よりも大きいかどうかを確認します。リーフからルートまでの各ノードについて、最大の合計を見つけます。
ソリューションの動作を説明するプログラム
例
#include <iostream> using namespace std; struct Node { int key; Node *left, *right; }; Node* newNode(int key) { Node* temp = new Node; temp->key = key; temp->left = temp->right = NULL; return temp; } int calcSumTreeSumRec(Node* root, int& ans) { if (root == NULL) return 0; int currSum = root->key + calcSumTreeSumRec(root->left, ans)+ calcSumTreeSumRec(root->right, ans); ans = max(ans, currSum); return currSum; } int calcMaxSubTreeSum(Node* root) { if (root == NULL) return 0; int ans = -100; calcSumTreeSumRec(root, ans); return ans; } int main() { Node* root = newNode(5); root->left = newNode(-4); root->right = newNode(4); root->left->left = newNode(3); root->left->right = newNode(8); root->right->left = newNode(-5); root->right->right = newNode(2); cout<<"The largest subtree sum is "<<calcMaxSubTreeSum(root); return 0; }
出力
The largest subtree sum is 13
-
C++の各ツリー行で最大値を見つける
二分木があるとすると、その木の各レベルの最大の要素を見つける必要があります。したがって、ツリーが次のような場合- その場合、出力は[3,5,8]になります。 これを解決するには、次の手順に従います- ansという配列を定義します 再帰関数solve()を定義します。これはツリーノードを取り、レベルは最初は0です。このメソッドは-のように機能します。 ノードがnullの場合は、を返します。 level =ansのサイズの場合、ノード値をansに挿入します。それ以外の場合、ans [level]:=ans[level]とノード値の最大値 呼び出しsol
-
C++の二分木で最大垂直和を見つける
二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace