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

সি++-এ বাইনারি ট্রির ডায়ামিটার O(n) [নতুন পদ্ধতি]


একটি বাইনারি ট্রির ডায়ামিটার হলো (left_height + right_height + 1) প্রতিটি নোডের জন্য। এই পদ্ধতিতে আমরা প্রতিটি নোডের জন্য (left_height + right_height + 1) ক্যালকুলেট করব এবং রেজাল্ট আপডেট করব। এখানে টাইম কমপ্লেক্সিটি O(n) থাকে।

প্রথমে স্ট্রাক্ট ডিফাইন করি যা ট্রি নোড রিপ্রেজেন্ট করবে যাতে ডেটা এবং এর বাম ও ডান চাইল্ড নোড থাকে। যদি এটি প্রথম নোড হয় তবে এটি রুট নোড হবে অন্যথায় চাইল্ড নোড।

struct Node { 
    int data; 
    struct Node *leftChild, *rightChild; 
};

পরবর্তীতে newNode(int data) ফাংশন তৈরি করি যা একটি int মান নেয় এবং সেটি নোডের ডেটা মেম্বরে অ্যাসাইন করে। ফাংশনটি তৈরি হওয়া struct Node-এর পয়েন্টার ফেরত দেয়। এছাড়া নতুন নোডের বাম ও ডান চাইল্ড নাল সেট করা হয়।

struct Node* newNode(int data){ 
    struct Node* newNode = new Node; 
    newNode->data = data; 
    newNode->leftChild = newNode->rightChild = NULL; 
    return (newNode); 
}

diameter(Node* root) ফাংশন রুট নোড নেয় এবং চেক করে রুট নাল কিনা। তারপর ans ভেরিয়েবল INT_MIN মান দিয়ে ডিক্লেয়ার করা হয়। height(root, ans) থেকে ফেরত আসা মান height_of_tree ভেরিয়েবলে স্টোর করা হয়। ans ফাংশন থেকে ফেরত দেওয়া হয়।

int diameter(Node* root){ 
    if (root == NULL) 
        return 0; 
    int ans = INT_MIN; 
    int height_of_tree = height(root, ans); 
    return ans; 
}

height(Node* root, int& ans) ফাংশন রুট নোড এবং রেফারেন্স হিসেবে ans ভেরিয়েবল নেয়। তারপর ইনঅর্ডার ট্রাভার্সাল করি ট্রির প্রতিটি সাবট্রির দৈর্ঘ্য ক্যালকুলেট করতে এবং প্রতিটি রিকার্সিভ কললে ans-এর ম্যাক্সিমাম মান পাস করা হয়। ans হলো (ans, 1 + left_height + right_height)-এর ম্যাক্স।

উদাহরণ

O(n) মেথডে বাইনারি ট্রির ডায়ামিটার বের করার ইমপ্লিমেন্টেশন:

#include <iostream> 
using namespace std; 

struct Node { 
    int data; 
    Node* leftChild, *rightChild; 
}; 

struct Node* newNode(int data){ 
    struct Node* newNode = new Node; 
    newNode->data = data; 
    newNode->leftChild = newNode->rightChild = NULL; 
    return (newNode); 
} 

int height(Node* root, int& ans){ 
    if (root == NULL) 
        return 0; 
    int left_height = height(root->left, ans); 
    int right_height = height(root->right, ans); 
    ans = max(ans, 1 + left_height + right_height); 
    return 1 + max(left_height, right_height); 
} 

int diameter(Node* root){ 
    if (root == NULL) 
        return 0; 
    int ans = INT_MIN; 
    int height_of_tree = height(root, ans); 
    return ans; 
} 

int main(){ 
    struct Node* root = newNode(1); 
    root->left = newNode(2); 
    root->right = newNode(3); 
    root->left->left = newNode(4); 
    root->left->right = newNode(5); 
    printf("Diameter is %d\n", diameter(root)); 
    return 0; 
}

আউটপুট

Diameter is 4
  1. বাইনারি ট্রি প্রুনিং C++-এ

  2. বাইনারি ট্রির সর্বোচ্চ প্রস্থ C++-এ

  3. সর্বোচ্চ বাইনারি ট্রি নির্মাণ C++-এ

  4. C++-এ বাইনারি ট্রি থেকে বাইনারি সার্চ ট্রি (BST) কনভার্ট করুন