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