মডিউল ১৮-৭ঃGet the Maximum Height of a Binary Tree

গত মডিউল গুলোতে আমরা দেখেছি কিভাবে Recursion এর সাহায্যে কোনো বাইনারী ট্রি এর Node এর কাউন্ট , কয়টি Leaf Node আছে তার কাউন্ট বের করা শিখেছি। Guess what ? এই প্রবলেম সল্ভ করার জন্য ও আমরা ঠিক একই ভাবে Recursive ওয়ে তে চিন্তা করে খুব সহজে সমস্যাটি সমাধান করে নিতে পারবো।

প্রথমে জেনে নেয়া যাক , কোনো একটি Binary Tree এর Maximum height কাকে বলে।

Root হতে সবচেয়ে দূরের Node এর মাঝে যত সংখ্যক Node আছে তাকে ঐ Binary Tree এর Maximum Node বলা হয়ে থাকে।

এখন দেখে নেয়া যাক , কীভাবে আমরা Recursive ওয়ে তে প্রবলেম টি চিন্তা করতে পারি

আমরা এমন একটি ফাংশন তৈরি করবো যেখানে আমরা একটি Binary Tree এর Root Node পাস করলে , ঐ ফাংশন টি আমাদের ঐ Binary Tree এর Maximum Height টি বের করে দিবে। এখন আমাদের কাজ হবে ঠিক ভাবে এই ভাবনা টা কে কাজে লাগানো এবং একটি Proper base case সেট করা

  • প্রথমত , আমরা যদি Binary Tree এর Node টি ফাংশনে পাস করি , এবং Root যদি নিজেই Null হয় তবে আমরা বলতে পারি এই Binary Tree তে কোনো Node নেই , এবং এই Binary Tree এর Maximum Height। এক্ষেত্রে ০ রিটার্ন হবে। ( Base Case )

  • যদি উপরের কোনোটি সত্যি না হয় তবে দেখার বিষয় হলো তার Left Subtree এর Maximum Height কত এবং তার Right Subtree তে Maximum Height কত ।

  • যেহেতু আমরা আমাদের ফাংশন কে এমন ভাবে ডিজাইন করেছি , তাকে একটি Root Node দেয়া হলে সে আমাকে ঐ Binary Tree এর Maximum Height কত তা বের করে দিবে , তাই আমরা নতুন করে আর ফাংশন না লিখে Left subtree এর Root Node একই ফাংশনে pass করে ঐ Subtree এর Maximum Height বের করে নিতে পারবো। এক্ষেত্রে Left subtree এর Root যা হলো Main Root এর Left child টি থেকে যে Tree উৎপন্ন হয়েছে , তাকে আমরা একটি Subtree বলতেছি .

  • Right subtree এর Maximum Height কতো তা বের করার জন্য আমরা একইভাবে আমাদের কাউন্ট করার ফাংশনটির হেল্প নিবো এবং তাকে Right subtree এর Root Node টি পাস করলে আমরা ঐ Subtree এর Maximum Height টি বের করে দিবে । এক্ষেত্রে Right subtree এর Root যা আসলে Main Root এর Right child টি থেকে যে Tree উৎপন্ন হয়েছে , তাকে আমরা একটি Subtree বলতেছি .

  • সবশেষে যেহেতু আমাকে Maximum Height টি বের করতে হবে , আমি Left subtree এর Maximum Height এবং Right subtree এর Maximum Height টি কম্পেয়ার করে দেখবো কোনটি Maximum তার সাথে ১ যোগ করে তা রিটার্ন করবো। ১ যোগ করার কারণে Root Node এর জন্য পুরো Tree এর Maximum Height এ একটি Node বাড়বে।

আসেন এইবার কোডটি দেখে নেয়া যাক Code:

#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
    int val;
    Node *left;
    Node *right;
    Node(int val)
    {
        this->val = val;
        this->left = NULL;
        this->right = NULL;
    }
};

// বাইনারী ট্রি ইনপুট নেয়ার কোড যা গত পেজে ব্যাখ্যা করা হয়েছে। 
Node *input_tree()
{
    int val;
    cin >> val;
    Node *root;
    if (val == -1)
        root = NULL;
    else
        root = new Node(val);
    queue<Node *> q;
    if (root)
        q.push(root);
    while (!q.empty())
    {
    
        Node *p = q.front();
        q.pop();

       
        int l, r;
        cin >> l >> r;
        Node *myLeft;
        Node *myRight;
        if (l == -1)
            myLeft = NULL;
        else
            myLeft = new Node(l);
        if (r == -1)
            myRight = NULL;
        else
            myRight = new Node(r);

        p->left = myLeft;
        p->right = myRight;

        
        if (p->left)
            q.push(p->left);
        if (p->right)
            q.push(p->right);
    }
    return root;
}

// এই ফাংশনটিতে কোনো একটি Binary Tree এর Root Node দেয়া হলে তা ঐ Binary Tree এর Maximum Height Return করে  
int maxHeight(Node *root)
{ 
   // Tree টি খালি হলে তার Maximum Height ০ হবে 
    if (root == NULL)
        return 0;
    int l = maxHeight(root->left); // Left subtree এর Maximum Height কত তা maxHeight ফাংশনের মাধ্যমে বের  করা হচ্ছে
    // এই ক্ষেত্রে Left subtree এর Root হলো current root Node এর left child
    int r = maxHeight(root->right);// Right subtree এর Maximum Height কত তা maxHeight ফাংশনের মাধ্যমে বের  করা হচ্ছে
    // এই ক্ষেত্রে Right subtree এর Root হলো current root Node এর right child
   
    return max(l, r) + 1; // এরপর left এবং right এর মধ্যে compare করে max height টি নিবো এবং তার সাথে ১ যোগ করে Return করে দিবো। 
}
int main()
{
    Node *root = input_tree();
    cout << maxHeight(root) << endl;
    return 0;
}

Last updated