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

বাইনারি ট্রিতে দেওয়া মান x-এর সমান যোগফল বিশিষ্ট সাবট্রি গণনা C++-এ


একটি বাইনারি ট্রি এবং একটি মান x ইনপুট হিসেবে দেওয়া আছে। লক্ষ্য হলো বাইনারি ট্রির সেই সাবট্রিগুলো খুঁজে বের করা যাদের নোডগুলোর ওজনের যোগফল x-এর সমান।

ইনপুট

x = 14। ইনপুট ভ্যালুগুলো থেকে যে ট্রি তৈরি হবে वो নিচে দেওয়া আছে:

বাইনারি ট্রিতে দেওয়া মান x-এর সমান যোগফল বিশিষ্ট সাবট্রি গণনা C++-এ

আউটপুট

Count of subtrees that sum up to a given value x are: 1

ব্যাখ্যা

আমাদের x ভ্যালু ১৪ দেওয়া আছে। দেখা যাচ্ছে শুধু একটি লিফ নোড আছে যার মান ১৪, তাই কাউন্ট ১।

ইনপুট

x = 33। ইনপুট ভ্যালুগুলো থেকে যে ট্রি তৈরি হবে वो নিচে দেওয়া আছে:

বাইনারি ট্রিতে দেওয়া মান x-এর সমান যোগফল বিশিষ্ট সাবট্রি গণনা C++-এ

আউটপুট

Count of subtrees that sum up to a given value x are: 2

ব্যাখ্যা

আমাদের x ভ্যালু ৩৩ দেওয়া আছে। দেখা যাচ্ছে দুটি সাবট্রি আছে যাদের যোগফল ৩৩, তাই কাউন্ট ২।

বাইনারি ট্রিতে দেওয়া মান x-এর সমান যোগফল বিশিষ্ট সাবট্রি গণনা C++-এ

বাইনারি ট্রিতে দেওয়া মান x-এর সমান যোগফল বিশিষ্ট সাবট্রি গণনা C++-এ

প্রোগ্রামে ব্যবহৃত পদ্ধতি:

এই পদ্ধতিতে আমরা রিকারসিভলি রুট নোডের লেফট সাবট্রি এবং রাইট সাবট্রির ওজনের যোগফল গণনা করি এবং শেষে রুটের ওজন যোগ করি। যদি সম x-এর সমান হয় তবে কাউন্ট বাড়ানো হয়।

  • একটি ট্রি Tree_Node তৈরি করা হয় রুট পয়েন্টার সহ।
  • insert_Node(int data) ফাংশন ট্রিতে নোড যোগ করে।
  • subtrees_x(Tree_Node* root, int x) ফাংশন রুট পয়েন্টার এবং x নিয়ে যোগফল x হয় এমন সাবট্রির কাউন্ট রিটার্ন করে।
  • স্ট্যাটিক ভেরিয়েবল count ০ এবং Tree_Node* temp = root।
  • Left_subtree = 0, Right_subtree = 0 লেফট ও রাইট সাবট্রির নোড ওজনের যোগফলের জন্য।
  • রুট NULL হলে সাম ০ রিটার্ন।
  • Left_subtree += subtrees_x(root->Left, x) লেফট সাবট্রির নোডের যোগফল।
  • Right_subtree += subtrees_x(root->Right, x) রাইট সাবট্রির নোডের যোগফল।
  • sum = Left_subtree + Right_subtree + root->data।
  • sum == x হলে count++।
  • temp != root হলে (স্টার্ট নোড নয়) Left_subtree + root->data + Right_subtree রিটার্ন।
  • শেষে count রিটার্ন করা হয় যেটি x সমান যোগফল বিশিষ্ট ট্রির কাঙ্ক্ষিত সংখ্যা।

উদাহরণ

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

struct Tree_Node {
    int data;
    Tree_Node *Left, *Right;
};

Tree_Node* insert_Node(int data) {
    Tree_Node* new_node = (Tree_Node*)malloc(sizeof(Tree_Node));
    new_node->data = data;
    new_node->Left = new_node->Right = NULL;
    return new_node;
}

int subtrees_x(Tree_Node* root, int x) {
    static int count = 0;
    static Tree_Node* temp = root;
    int Left_subtree = 0, Right_subtree = 0;
    if (root == NULL) {
        return 0;
    }
    Left_subtree += subtrees_x(root->Left, x);
    Right_subtree += subtrees_x(root->Right, x);
    int sum = Left_subtree + Right_subtree + root->data;
    if (sum == x) {
        count++;
    }
    if (temp != root) {
        int set = Left_subtree + root->data + Right_subtree;
        return set;
    }
    return count;
}

int main() {
    Tree_Node* root = insert_Node(10);
    root->Left = insert_Node(20);
    root->Right = insert_Node(12);
    root->Left->Left = insert_Node(14);
    root->Left->Right = insert_Node(1);
    root->Right->Left = insert_Node(21);
    root->Right->Right = insert_Node(11);
    int x = 14;
    cout << "Count of subtrees that sum up to a given value x are: " << subtrees_x(root, x);
    return 0;
}

আউটপুট

Count of subtrees that sum up to a given value x are: 1

  1. C++-এ দুটি BST-র নোড জোড়া যাদের যোগফল x গণনা

  2. C++-এ ইউনিভ্যালু সাবট্রি গণনা

  3. C++-এ BST-এ দিয়ে যাওয়া রেঞ্জে (Range) পড়া নোডের সংখ্যা গণনা

  4. C++-এ পাথ সম III