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

하위 트리가 C++ 프로그램의 BST이기도 한 이진 트리의 최대 하위 트리 합계

<시간/>

이 문제에서는 이진 트리 BT가 주어집니다. 우리의 임무는 하위 트리도 BST가 되도록 이진 트리에서 최대 하위 트리 합을 찾는 프로그램을 만드는 것입니다.

Binary Tree는 각 노드가 최대 2개의 자식을 가질 수 있는 특별한 조건이 있습니다.

하위 트리가 C++ 프로그램의 BST이기도 한 이진 트리의 최대 하위 트리 합계

이진 탐색 트리는 모든 노드가 아래에 언급된 속성을 따르는 트리입니다.

  • 왼쪽 하위 트리의 키 값이 상위(루트) 노드의 키 값보다 작습니다.

  • 오른쪽 하위 트리의 키 값이 상위(루트) 노드의 키 값보다 크거나 같습니다.

하위 트리가 C++ 프로그램의 BST이기도 한 이진 트리의 최대 하위 트리 합계

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

입력

하위 트리가 C++ 프로그램의 BST이기도 한 이진 트리의 최대 하위 트리 합계

출력

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