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

隣接するレベルを持つツリーからの最大合計はC++では許可されていません


この問題では、正の数で構成される二分木が与えられます。私たちのタスクは、C++では許可されていない隣接するレベルを持つツリーから最大合計を見つけるプログラムを作成することです。

コードの説明

ここでは、ツリーの2つの隣接するレベルのノードが合計に含まれないように、ツリーのノードの最大合計を求めます。

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

出力

21

説明

ルートを開始レベルとして、合計=5 + 3 + 8 + 1 =17ルートのサブ子を開始レベルとして、合計=2 + 6 + 9 + 4 =21

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

maxSumを見つけるための条件のひとつは、隣接する要素がないことです。このために、ルートノード(レベル1)から1つの合計セットを取得し、子ノード(レベル2)から別の合計セットを取得します。次の合計ノードは、孫ノードを見つけることによって現在のノードから抽出されます。

このために、maxSum値を再帰的に見つけ、レベル1またはレベル2から始まる合計の最大合計値が結果のmaxSumになります。

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

#include<bits/stdc++.h>
using namespace std;
struct Node{
   int data;
   Node* left, *right;
   Node(int item){
      data = item;
   }
};
int getMaxSum(Node* root) ;
int findSumFromNode(Node* root){
   if (root == NULL)
      return 0;
      int sum = root->data;
   if (root->left != NULL){
      sum += getMaxSum(root->left->left);
      sum += getMaxSum(root->left->right);
   }
   if (root->right != NULL){
      sum += getMaxSum(root->right->left);
      sum += getMaxSum(root->right->right);
   }
   return sum;
}
int getMaxSum(Node* root){
   if (root == NULL)
      return 0;
      return max(findSumFromNode(root), (findSumFromNode(root->left) + findSumFromNode(root->right)));
}
int main(){
   Node* root = new Node(5);
   root->left = new Node(2);
   root->right = new Node(10);
   root->left->left = new Node(4);
   root->left->right = new Node(6);
   root->right->right = new Node(9);
   cout<<"The maximum sum from a tree with adjacent levels not allowed is "<<getMaxSum(root);
   return 0;
}

出力

The maximum sum from a tree with adjacent levels not allowed is 24

  1. C++のバイナリツリーの最大スパイラル合計

    この問題では、二分木が与えられます。私たちのタスクは、C++のバイナリツリーで最大スパイラル合計を見つけるプログラムを作成することです。 スパイラルサム 二分木のスパイラルトラバーサルで遭遇するノードの合計です。 ツリーのスパイラルトラバーサルでは、ノードはルートからリーフノードにトラバースされます。トラバーサルは左から右に行われ、次のレベルでは右から左に、以下同様に次のレベルで行われます。 例 − 出力 −5 説明 − ツリーの第2レベルの最初のノードまでスパイラルトラバーサルを検討します。 1+ 5 = 5. 3行目の合計要素は(1-9 + 6-4 =-6)であり

  2. C++のバイナリツリーの最大パス合計

    この問題では、各ノードに値が含まれる二分木が与えられます。私たちのタスクは、二分木の2つの葉の間の最大パスの合計を見つけるプログラムを作成することです。 ここでは、値の最大合計を提供する、あるリーフノードから別のリーフノードへのパスを見つける必要があります。この最大合計パスには、ルートノードを含めることができます/含めることができません。 二分木 は、各ノードが最大2つの子ノードを持つことができるツリーデータ構造です。これらは左の子と右の子と呼ばれます。 例 − 問題を理解するために例を見てみましょう- 入力 −//二分木… 出力 − 24 説明 −リーフノード− 2から9へ