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

বাইনারি ট্রিতে ২-এর ঘাত বিশিষ্ট ওজন সম্পন্ন নোড গণনা C++-এ


একটি বাইনারি ট্রি দেওয়া আছে যার নোডগুলোর ওজন সংখ্যা হিসেবে আছে। লক্ষ্য হলো সেই নোডগুলোর সংখ্যা বের করা যাদের ওজন ২-এর ঘাত (power of two)। যদি ওজন ৩২ হয় তবে সেটি ২⁵, সুতরাং নোডটি গণনা হবে।

ইনপুট

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

বাইনারি ট্রিতে ২-এর ঘাত বিশিষ্ট ওজন সম্পন্ন নোড গণনা C++-এ

আউটপুট

Count the nodes in the given tree whose weight is a power of two are: 3

ব্যাখ্যা

আমাদের ট্রি নোডগুলো এবং প্রতিটি নোডের সাথে যুক্ত ওজন দেওয়া আছে। এখন প্রতিটি ওজনের ঘাত গণনা করে চেক করা হচ্ছে এটা ২-এর ঘাত হিসেবে এক্সপ্রেস করা যায় কিনা।
নোড ওজন ওজন^২ ২-এর ঘাত
2 8 2×2×2 না
1 100 10×2 হ্যাঁ
4 211 প্রাইম নাম্বার না
3 16 4² হ্যাঁ
8 1717 সম্ভব নয় না
9 32 2×2×2×2×2 হ্যাঁ

ইনপুট

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

বাইনারি ট্রিতে ২-এর ঘাত বিশিষ্ট ওজন সম্পন্ন নোড গণনা C++-এ

আউটপুট

Count the nodes in the given tree whose weight is a power of two are: 3

ব্যাখ্যা

আমাদের ট্রি নোডগুলো এবং প্রতিটি নোডের সাথে যুক্ত ওজন দেওয়া আছে। এখন প্রতিটি ওজনের ডিজিট সম গণনা করে চেক করা হচ্ছে এটা অড্ড কিনা।
নোড ওজন ওজন ^ ২ ২-এর ঘাত
2 16 4² হ্যাঁ
1 141 সম্ভব নয় না
4 41 প্রাইম নাম্বার না
3 64 8² হ্যাঁ
8 81 9² হ্যাঁ

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

এই পদ্ধতিতে আমরা ট্রির গ্রাফে DFS অ্যাপ্লাই করি ট্রভারস করতে এবং চেক করি নোডের ওজন ২-এর ঘাত কিনা। দুটি ভেক্টর Node_Weight(100) এবং edge_graph[100] নেওয়া হয়।

  • Node_Weight[] নোডের ওজন দিয়ে ইনিশিয়ালাইজ করা হয়।
  • edge_graph ভেক্টর দিয়ে ট্রি তৈরি করা হয়।
  • গ্লোবাল ভেরিয়েবল sum (এখানে powers) ০ দিয়ে ইনিশিয়ালাইজ।
  • power_two(int node, int root) ফাংশন নোড এবং রুট নোড নিয়ে ২-এর ঘাত ওজন বিশিষ্ট নোড কাউন্ট রিটার্ন করে।
  • set = Node_Weight[node] নেওয়া হয়।
  • set && (!(set & (set - 1))) true হলে সেটি ২-এর ঘাত (বিটওয়াইজ AND এবং নেগেশন)।
  • powers++ বাড়ানো হয়।
  • edge_graph[node] ট্রভারস করে রিকারসিভ কল power_two(it, node)।
  • শেষে powers ভেরিয়েবলে প্রয়োজনীয় কাউন্ট পাওয়া যায়।

উদাহরণ

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

vector<int> Node_Weight(100);
vector<int> edge_graph[100];
int powers = 0;

void power_two(int node, int root) {
    int set = Node_Weight[node];
    if (set && (!(set & (set - 1)))) {
        powers++;
    }
    for (int it : edge_graph[node]) {
        if (it == root) {
            continue;
        }
        power_two(it, node);
    }
}

int main() {
    // নোডের ওজন
    Node_Weight[2] = 8;
    Node_Weight[1] = 100;
    Node_Weight[4] = 211;
    Node_Weight[3] = 16;
    Node_Weight[8] = 7171;
    Node_Weight[9] = 32;
    // গ্রাফ এজ তৈরি
    edge_graph[2].push_back(1);
    edge_graph[2].push_back(4);
    edge_graph[4].push_back(3);
    edge_graph[4].push_back(8);
    edge_graph[8].push_back(9);
    power_two(2, 2);
    cout << "Count the nodes in the given tree whose weight is a power of two are: " << powers;
    return 0;
}

আউটপুট

Count the nodes in the given tree whose weight is a power of two are: 3

  1. C++-এ সম্পূর্ণ বাইনারি ট্রির নোড গণনা (Count Complete Tree Nodes)

  2. C++-এ বাইনারি ট্রির প্রতিটি লেভেলে নন-লিফ নোডের ম্যাক্সিমাম সাম

  3. C++-এ বাইনারি ট্রিতে দুটি লেভেলের মাঝপথে সব নোড প্রিন্ট করা

  4. C++-এ পারফেক্ট বাইনারি ট্রি (Perfect Binary Tree) সকল নোডের যোগফল নির্ণয়