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

C++-এ সোর্টেড লিস্টকে বাইনারি সার্চ ট্রি (BST) তে রূপান্তর


ধরুন আমাদের একটি সিংলি লিঙ্কড লিস্ট আছে যেটির এলিমেন্টগুলো অ্যাসেন্ডিং অর্ডারে সোর্টেড। আমাদের এটিকে একটি হাইট-ব্যালেন্সড BST-এ কনভার্ট করতে হবে। লিস্ট [-10, -3, 0, 5, 9] হলে সম্ভাব্য ট্রি হবে −

C++-এ সোর্টেড লিস্টকে বাইনারি সার্চ ট্রি (BST) তে রূপান্তর

সমাধানের ধাপগুলো:

  • যদি লিস্ট খালি হয়, তবে null রিটার্ন করুন

  • সর্টেডলিস্টটুBST() নামে একটি রিকারসিভ মেথড ডিফাইন করুন যা লিস্টের স্টার্ট নোড নেবে

  • x := লিস্ট a থেকে মিড নোডের প্রিভিয়াস নোডের অ্যাড্রেস

  • mid := সঠিক মিড নোড

  • mid-এর ভ্যালু নিয়ে একটি নতুন নোড তৈরি করুন

  • nextStart := mid নোডের next

  • mid next কে null সেট করুন

  • নোডের রাইট := sortedListToBST(nextStart)

  • যদি x null নয় হয়, তবে x-এর next = null এবং নোডের লেফট := sortedListToBST(a)

  • নোড রিটার্ন করুন

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −

#include <bits/stdc++.h> using namespace std; class ListNode{    public:    int val;    ListNode *next;    ListNode(int data){       val = data;       next = NULL;    } }; ListNode *make_list(vector<int> v){    ListNode *head = new ListNode(v[0]);    for(int i = 1; i<v.size(); i++){       ListNode *ptr = head;       while(ptr->next != NULL){          ptr = ptr->next;       }       ptr->next = new ListNode(v[i]);    }    return head; } class TreeNode{    public:    int val;    TreeNode *left, *right;    TreeNode(int data){       val = data;       left = right = NULL;    } }; void inord(TreeNode *root){    if(root != NULL){       inord(root->left);       cout << root->val << " ";       inord(root->right);    } } class Solution {    public:    pair <ListNode*, ListNode*> getMid(ListNode* a){       ListNode* prev = NULL;       ListNode* fast = a;       ListNode* slow = a;       while(fast && fast->next){          fast = fast->next->next;          prev = slow;          slow = slow->next;       }       return {prev, slow};    }    TreeNode* sortedListToBST(ListNode* a) {       if(!a)return NULL;       pair<ListNode*, ListNode*> x = getMid(a);       ListNode* mid = x.second;       TreeNode* Node = new TreeNode(mid->val);       ListNode* nextStart = mid->next;       mid->next = NULL;       Node->right = sortedListToBST(nextStart);       if(x.first){          x.first->next = NULL;          Node->left = sortedListToBST(a);       }       return Node;    } }; main(){    vector<int> v = {-10,-3,0,5,9};    ListNode *head = make_list(v);    Solution ob;    inord(ob.sortedListToBST(head)); }

ইনপুট

[-10,-3,0,5,9]

আউটপুট

-10 -3 0 5 9
  1. C++-এ Binary Search Tree-এ নোড ইনসার্ট করা

  2. C++-এ বাইনারি সার্চ ট্রি ইটারেটর (Binary Search Tree Iterator)

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

  4. পাইথনে সোর্টেড অ্যারে থেকে বাইনারি সার্চ ট্রি (Convert Sorted Array to BST)