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

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


ধরা যাক একটি ইন্টিজার অ্যারে আছে। সেটির সব উপাদান ইউনিক। এই অ্যারে ওপর একটি সর্বোচ্চ ট্রি (maximum tree) নির্মাণের নিয়ম নিচের মতো −

  • রুট অ্যারেতে সর্বোচ্চ সংখ্যাটি ধারণ করবে।

  • বাম সাবট্রি হবে সর্বোচ্চ সংখ্যার বামপাশের সাবঅ্যারে থেকে নির্মিত সর্বোচ্চ ট্রি।

  • ডান সাবট্রি হবে সর্বোচ্চ সংখ্যার ডানপাশের সাবঅ্যারে থেকে নির্মিত সর্বোচ্চ ট্রি।

আমাদের সর্বোচ্চ বাইনারি ট্রি কনস্ট্রাক্ট করতে হবে। যদি ইনপুট হয়: [3,2,1,6,0,5], তবে আউটপুট হবে −

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


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

  • solve() নামে একটি মেথড সংজ্ঞা করব, যা লিস্ট, left এবং right মান নিবে। ফাংশনটি নিচেরভাবে কাজ করবে −

  • যদি left > right হয়, তবে null রিটার্ন করব

  • maxIndex := left এবং maxVal := nums[left]

  • i = left + 1 থেকে right পর্যন্ত

    • যদি maxVal < nums[i] হয়, তবে maxVal := nums[i], maxIndex := i

  • maxVal মান দিয়ে একটি নোড তৈরি করব

  • নোডের বাম := solve(nums, left, maxIndex - 1)

  • নোডের ডান := solve(nums, maxIndex + 1, right)

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

  • solve মেথডটি মেইন সেকশন থেকে নিচেরভাবে কল হবে: solve(nums, 0, nums অ্যারের দৈর্ঘ্য - 1)

নিচের ইমপ্লিমেন্টেশন দেখুন −

উদাহরণ

#include <bits/stdc++.h> using namespace std; class TreeNode{    public:    int val;    TreeNode *left, *right;    TreeNode(int data){       val = data;       left = NULL;       right = NULL;    } }; void insert(TreeNode **root, int val){    queue<TreeNode*> q;    q.push(*root);    while(q.size()){       TreeNode *temp = q.front();       q.pop();       if(!temp->left){          if(val != NULL)           temp->left = new TreeNode(val);       else          temp->left = new TreeNode(0);          return;       } else {          q.push(temp->left);       }       if(!temp->right){          if(val != NULL)           temp->right = new TreeNode(val);          else           temp->right = new TreeNode(0);          return;       } else {          q.push(temp->right);       }    } } TreeNode *make_tree(vector<int> v){    TreeNode *root = new TreeNode(v[0]);    for(int i = 1; i<v.size(); i++){       insert(&root, v[i]);    }    return root; } void inord(TreeNode *root){    if(root != NULL){       inord(root->left);       cout << root->val << " ";       inord(root->right);    } } class Solution {    public:    TreeNode* solve(vector <int>& nums, int left, int right){       if(left>right)return NULL;       int maxIndex = left;       int maxVal = nums[left];       for(int i = left + 1; i <= right; i++){          if(maxVal < nums[i]){             maxVal = nums[i];             maxIndex = i;          }       }       TreeNode* node = new TreeNode(maxVal);       node->left = solve(nums, left, maxIndex - 1);       node->right = solve(nums, maxIndex + 1, right);       return node;    }    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {       return solve(nums, 0, nums.size() - 1);    } }; main(){    vector<int> v = {4,3,2,7,1,6};    Solution ob;    inord(ob.constructMaximumBinaryTree(v)); }

ইনপুট

[3,2,1,6,0,5]

আউটপুট

4 3 2 7 1 6

  1. C++-এ বাইনারি ট্রিতে সর্বোচ্চ স্পাইরাল যোগফল

  2. C++-এ বাইনারি ট্রিতে সর্বোচ্চ পথ যোগফল

  3. বাইনারি ট্রিতে সর্বোচ্চ লেভেল প্রোডাক্ট (C++)

  4. বাইনারি ট্রিতে ভার্টিকাল সমের সর্বোচ্চ মান খুঁজে বের করা C++-তে