Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 이진 트리의 최대 경로 합계


이 문제에서는 값을 포함하는 각 노드가 있는 이진 트리가 제공됩니다. 우리의 임무는 이진 트리의 두 잎 사이의 최대 경로 합을 찾는 프로그램을 만드는 것입니다.

여기서 우리는 값의 최대 합을 제공할 하나의 리프 노드에서 다른 리프 노드까지의 경로를 찾아야 합니다. 이 최대 합 경로는 루트 노드를 포함할 수 있거나 포함할 수 없습니다.

이진 트리 각 노드가 최대 2개의 자식 노드를 가질 수 있는 트리 데이터 구조입니다. 이를 왼쪽 자식과 오른쪽 자식이라고 합니다.

-

C++에서 이진 트리의 최대 경로 합계

문제를 이해하기 위해 예를 들어 보겠습니다. −

입력 - //이진 트리...

출력 − 24

설명 − 리프 노드 − 2에서 9까지의 경로는 (2 + 5 + 6 -2 + 4 + 9 ) =24인 최대 합을 제공합니다.

이 문제를 해결하기 위해 트리 순회를 수행하고 현재 노드에 대한 왼쪽 하위 트리/오른쪽 하위 트리의 최대 합계를 저장합니다. 또한 지금까지 두 리프 노드 사이의 최대 경로를 찾습니다.

모든 노드에 대해 하위 트리에 대해 가능한 최대 리프 간 경로를 찾을 수 있습니다. 그런 다음 전체 최대 경로와 비교하여 두 값의 최대값을 전역 최대 경로 합계 값에 저장합니다.

솔루션을 더 잘 이해하기 위해 예제에서 이 솔루션을 살펴보겠습니다. −

전역 최대 합계 =6(경로 2→5→-1의 경우)

이제 6을 루트 노드로 사용하는지 확인합니다.

C++에서 이진 트리의 최대 경로 합계

왼쪽 하위 트리에서 -

리프 노드까지의 경로의 합은 7과 4입니다.

최대값은 7입니다(경로 5→2의 경우).

오른쪽 하위 트리에서 -

리프 노드까지의 경로 합은 경로(1rarr;-3rarr;7)에 대해 5이며 가능한 한 방법입니다.

아니요, 리프 노드 간의 경로 합은 -

입니다.

왼쪽 하위 트리에서 리프에서 루트(6)까지의 최대 합계 + 루트 + 오른쪽 하위 트리에서 리프에서 루트(6)까지의 최대 합계 =7 + 6 + 5 =18.

전역 최대 경로 합계(6)와 비교하면 새로운 전역 최대 경로 합계 =18입니다.

예시

두 리프 노드 사이의 최대 경로 합을 찾는 프로그램 -

#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