কম্পিউটার টিউটোরিয়াল

C++-এ बैলেন্সড BST-তে যোগফল শূন্য হওয়া ট্রিপলেট আছে কিনা যাচাই


একটি ব্যালেন্সড বাইনারি সার্চ ট্রি দেওয়া আছে। is_valid_triplet() ফাংশন লিখুন যা true ফেরত দেবে যদি যোগফল শূন্য হওয়া ট্রিপলেট থাকে, নয় তবে false। কনস্ট্রেইন্ট: টাইম O(n²), এক্সট্রা স্পেস O(log n)।

ইনপুট ট্রি (চিত্র): -15, 7, 8 ট্রিপলেটের যোগফল ০। আউটপুট: True।

সমাধানের ধাপসমূহ

  • BST কে ডাবলি লিংকড লিস্ট-এ কনভার্ট করুন (ইন-অর্ডার ট্রাভার্সাল)।
  • ডাবলি লিস্ট-এ টু-পয়েন্টার টেকনিক দিয়ে দুটি সংখ্যার যোগফল নির্দিষ্ট মান হয় কিনা চেক করুন।
  • প্রতিটি নেগেটিভ নোডের জন্য বাকি লিস্টে তার ঋণাত্মক মান এর সমান যোগফল দিয়ে জোড়া আছে কিনা চেক করুন।

উদাহরণ (C++ কোড)

#include <bits/stdc++.h>
using namespace std;

class TreeNode {
public:
    int key;
    TreeNode *left, *right;
    TreeNode() : key(0), left(NULL), right(NULL) {}
    TreeNode(int x) : key(x), left(NULL), right(NULL) {}
};

void bst_to_doubli_list(TreeNode* root, TreeNode** head, TreeNode** tail) {
    if (root == NULL) return;
    if (root->left) bst_to_doubli_list(root->left, head, tail);
    root->left = *tail;
    if (*tail) (*tail)->right = root;
    else *head = root;
    *tail = root;
    if (root->right) bst_to_doubli_list(root->right, head, tail);
}

bool is_in_double_list(TreeNode* head, TreeNode* tail, int sum) {
    while (head != tail) {
        int current = head->key + tail->key;
        if (current == sum) return true;
        else if (current > sum) tail = tail->left;
        else head = head->right;
    }
    return false;
}

bool is_valid_triplet(TreeNode *root) {
    if (root == NULL) return false;
    TreeNode* head = NULL; TreeNode* tail = NULL;
    bst_to_doubli_list(root, &head, &tail);
    while ((head->right != tail) && (head->key < 0)) {
        if (is_in_double_list(head->right, tail, -1*head->key)) return true;
        else head = head->right;
    }
    return false;
}

TreeNode* insert(TreeNode* root, int key) {
    if (root == NULL) return new TreeNode(key);
    if (root->key > key) root->left = insert(root->left, key);
    else root->right = insert(root->right, key);
    return root;
}

int main() {
    TreeNode* root = NULL;
    root = insert(root, 7);
    root = insert(root, -15);
    root = insert(root, 15);
    root = insert(root, -7);
    root = insert(root, 14);
    root = insert(root, 16);
    root = insert(root, 8);
    cout << is_valid_triplet(root);
}

ইনপুট

7, -15, 15, -7, 14, 16, 8

আউটপুট

1 (True)
  1. ব্যালেন্সড BST-এ দেওয়া সমের সাথে একটি জোড়া খুঁজে বের করা C++-তে

  2. C++ ব্যবহার করে অ্যারেতে a % b = k সেটি করার সব জোড়া (a, b) বের করা

  3. C++ প্রোগ্রাম: গ্রাফের ট্রানজিটিভ ক্লোজার (Warshall's Algorithm)

  4. C#-তে যোগফল শূন্য হয় এমন সকল ইউনিক ট্রিপলেট বের করুন