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

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


この問題では、各ノードに値が含まれる二分木が与えられます。私たちのタスクは、二分木の2つの葉の間の最大パスの合計を見つけるプログラムを作成することです。

ここでは、値の最大合計を提供する、あるリーフノードから別のリーフノードへのパスを見つける必要があります。この最大合計パスには、ルートノードを含めることができます/含めることができません。

二分木 は、各ノードが最大2つの子ノードを持つことができるツリーデータ構造です。これらは左の子と右の子と呼ばれます。

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

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

入力 −//二分木…

出力 − 24

説明 −リーフノード− 2から9へのパスは、(2 + 5 + 6 -2 + 4 + 9)=24

である最大合計を与えます。

この問題を解決するために、ツリートラバーサルを実行し、現在のノードの左側のサブツリー/右側のサブツリーの最大合計を格納します。また、これまでのところ、2つのリーフノード間の最大パスが見つかります。

の場合、すべてのノードで、そのサブツリーの可能な最大のリーフからリーフへのパスが見つかります。次に、それを全体の最大パスと比較し、両方の値の最大値をグローバル最大パス合計値に格納します。

ソリューションをよりよく理解するために、この例からこのソリューションを見てみましょう-

グローバル最大合計=6(パス2→5→-1の場合)

次に、ルートノードとして6を取得することを確認します。

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

左側のサブツリー-

リーフノードまでのパスの合計は7と4です。

最大は7です(パス5→2の場合)。

右側のサブツリー-

リーフノードまでのパスの合計は、パス(1rarr; -3rarr; 7)に対して5であり、これは1つの可能な方法です。

いいえ、リーフノード間のパスの合計は-

です。

左側のサブツリーのリーフからルート(6)までの最大合計+ルート+右側のサブツリーのリーフからルート(6)までの最大合計=7 + 6 + 5 =18

グローバル最大パス合計(6)と比較すると、新しいグローバル最大パス合計=18です。

2つのリーフノード間の最大パス合計を見つけるプログラム-

#include <bits/stdc++.h>
using namespace std;
struct Node{
   int data;
   struct Node* left, *right;
};
struct Node* insertNode(int data){
   struct Node* node = new(struct Node);
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
int max(int a, int b)
{ return (a >= b)? a: b; }
int maxPathSumLeaf(struct Node *root, int &maxSum){
   if (root==NULL) return 0;
   if (!root->left && !root->right) return root->data;
   int leftSubTree = maxPathSumLeaf(root->left, maxSum);
   int rightSubTree = maxPathSumLeaf(root->right, maxSum);
   if (root->left && root->right){
      maxSum = max(maxSum, leftSubTree + rightSubTree + root->data);
      return max(leftSubTree, rightSubTree) + root->data;
   }
   return (!root->left)? rightSubTree + root->data: leftSubTree + root->data;
}
int main(){
   struct Node *root = insertNode(-2);
   root->left = insertNode(6);
   root->right = insertNode(4);
   root->left->left = insertNode(5);
   root->left->right = insertNode(1);
   root->left->left->left = insertNode(2);
   root->left->left->right = insertNode(-1);
   root->left->right->left = insertNode(-3);
   root->left->right->left->left = insertNode(7);
   root->right->left = insertNode(9);
   root->right->right = insertNode(3);
   int maxSum = INT_MIN;
   maxPathSumLeaf(root, maxSum);
   cout<<"Max pathSum of between two leaf nodes for the given binary tree is "<<maxSum;
   return 0;
}

出力

Max pathSum of between two leaf nodes for the given binary tree is 24

  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. Pythonでの二分木最大パス合計

    空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri