이 문제에서는 양수로 구성된 이진 트리가 제공됩니다. 우리의 임무는 C++에서 허용되지 않는 인접 레벨을 가진 트리에서 최대 합을 찾는 프로그램을 만드는 것입니다.
코드 설명
여기에서 트리의 인접한 두 수준의 노드가 합계에 포함되지 않는 방식으로 트리 노드의 최대 합계를 찾습니다.
문제를 이해하기 위해 예를 들어보겠습니다.
출력
21
설명
루트를 시작 레벨로 사용, 합계 =5 + 3 + 8 + 1 =17 루트의 하위 자식을 시작 레벨로 취, 합계 =2 + 6 + 9 + 4 =21
솔루션 접근 방식
maxSum을 찾기 위한 한 가지 조건은 인접 요소가 없다는 것입니다. 이를 위해 루트 노드(레벨 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