ในปัญหานี้ เราได้รับไบนารีทรี BT งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมของทรีย่อยสูงสุดในทรีไบนารีเพื่อให้ทรีย่อยเป็น BST ด้วย
Binary Tree มีเงื่อนไขพิเศษที่แต่ละโหนดสามารถมีลูกได้สูงสุดสองคน

Binary Search Tree เป็นต้นไม้ที่โหนดทั้งหมดเป็นไปตามคุณสมบัติที่กล่าวถึงด้านล่าง
-
ค่าของคีย์ของทรีย่อยทางซ้ายนั้นน้อยกว่าค่าของคีย์ของโหนดหลัก (รูท)
-
ค่าของคีย์ของทรีย่อยทางขวามากกว่าหรือเท่ากับค่าของคีย์ของโหนดหลัก (รูท)

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต

ผลลัพธ์
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