Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผลรวมซับทรีสูงสุดในต้นไม้แบบทวิภาคที่ซับทรีเป็น BST ในโปรแกรม C++

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

ต้นไม้แบบทวิภาค (Binary Tree) มีเงื่อนไขพิเศษคือแต่ละโหนดสามารถมีลูกได้สูงสุดสองตัว

ผลรวมซับทรีสูงสุดในต้นไม้แบบทวิภาคที่ซับทรีเป็น BST ในโปรแกรม C++

ต้นไม้ค้นหาแบบทวิภาค (Binary Search Tree) เป็นต้นไม้ที่โหนดทั้งหมดปฏิบัติตามคุณสมบัติด้านล่าง

  • ค่าของคีย์ซับทรีซ้าย น้อยกว่าค่าของคีย์โหนดพ่อ (ราก)
  • ค่าของคีย์ซับทรีขวา มากกว่าหรือเท่ากับค่าของคีย์โหนดพ่อ (ราก)

ผลรวมซับทรีสูงสุดในต้นไม้แบบทวิภาคที่ซับทรีเป็น BST ในโปรแกรม C++

ตัวอย่าง

อินพุต

ผลรวมซับทรีสูงสุดในต้นไม้แบบทวิภาคที่ซับทรีเป็น BST ในโปรแกรม C++

เอาต์พุต

32

คำอธิบาย

ที่นี่เรามีซับทรีสองอันที่เป็น BST ผลรวมของพวกเขาคือ

7 + 3 + 22 = 32 
6 + 5 + 17 = 28 
สูงสุด = 32

แนวทางแก้ปัญหา

วิธีแก้ที่ง่ายคือการเดินทางผ่านโครงสร้างข้อมูลต้นไม้ แล้วตรวจสอบที่แต่ละโหนดว่าลูกของมันสามารถสร้างต้นไม้ค้นหาแบบทวิภาคได้หรือไม่ หากเราพบผลรวมของโหนดทั้งหมดที่มีส่วนทำให้เป็น BST แล้วคืนค่าสูงสุดของ BSTSum ทั้งหมดที่พบ

ตัวอย่างโค้ด

โปรแกรมสำหรับแสดงการทำงานของวิธีแก้ปัญหาของเรา

#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