이 문제에서는 이진 트리 BT가 주어집니다. 우리의 임무는 하위 트리도 BST가 되도록 이진 트리에서 최대 하위 트리 합을 찾는 프로그램을 만드는 것입니다.
Binary Tree는 각 노드가 최대 2개의 자식을 가질 수 있는 특별한 조건이 있습니다.
이진 탐색 트리는 모든 노드가 아래에 언급된 속성을 따르는 트리입니다.
-
왼쪽 하위 트리의 키 값이 상위(루트) 노드의 키 값보다 작습니다.
-
오른쪽 하위 트리의 키 값이 상위(루트) 노드의 키 값보다 크거나 같습니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력
출력
32
설명
여기에 BST인 두 개의 하위 트리가 있습니다. 그들의 합계는,
7 + 3 + 22 = 32 6 + 5 + 17 = 28 Maximum = 32.
해결 방법
문제에 대한 간단한 해결책은 트리 데이터 구조를 탐색한 다음 각 노드에서 자식 노드가 이진 검색 트리를 형성할 수 있는지 여부를 확인하는 것입니다. BST에 기여하는 모든 노드의 합을 찾은 다음 발견된 모든 BTSum의 최대값을 반환하면
예
우리 솔루션의 작동을 설명하는 프로그램
#include <bits/stdc++.h> using namespace std; int findMax(int a, int b){ if(a > b) return a; return b; } int findMin(int a, int b){ if(a > b) return b; return a; } struct Node { struct Node* left; struct Node* right; int data; Node(int data){ this−>data = data; this−>left = NULL; this−>right = NULL; } }; struct treeVal{ int maxVal; int minVal; bool isBST; int sum; int currMax; }; treeVal CalcBSTSumTill(struct Node* root, int& maxsum){ if (root == NULL) return { −10000, 10000, true, 0, 0 }; if (root−>left == NULL && root−>right == NULL) { maxsum = findMax(maxsum, root−>data); return { root−>data, root−>data, true, root−>data, maxsum }; } treeVal LeftSTree = CalcBSTSumTill(root−>left, maxsum); treeVal RightSTree = CalcBSTSumTill(root−>right, maxsum); treeVal currTRee; if (LeftSTree.isBST && RightSTree.isBST && LeftSTree.maxVal < root−>data && RightSTree.minVal > root−>data) { currTRee.maxVal = findMax(root−>data, findMax(LeftSTree.maxVal, RightSTree.maxVal)); currTRee.minVal = findMin(root−>data, findMin(LeftSTree.minVal, RightSTree.minVal)); maxsum = findMax(maxsum, RightSTree.sum + root−>data + LeftSTree.sum); currTRee.sum = RightSTree.sum + root−>data + LeftSTree.sum; currTRee.currMax = maxsum; currTRee.isBST = true; return currTRee; } currTRee.isBST = false; currTRee.currMax = maxsum; currTRee.sum = RightSTree.sum + root−>data + LeftSTree.sum; return currTRee; } int CalcMaxSumBST(struct Node* root){ int maxsum = −10000; return CalcBSTSumTill(root, maxsum).currMax; } int main(){ struct Node* root = new Node(10); root−>left = new Node(12); root−>left−>right = new Node(7); root−>left−>right−>left = new Node(3); root−>left−>right−>right = new Node(22); root−>right = new Node(6); root−>right−>left = new Node(5); root−>right−>left−>right = new Node(17); cout<<"The maximum sub−tree sum in a Binary Tree such that the sub−tree is also a BST is "<<CalcMaxSumBST(root); return 0; }
출력
The maximum sub−tree sum in a Binary Tree such that the sub−tree is also a BST is 32