ধরুন আমাদের একটি সর্বাধিক গাছের একটি রুট নোড আছে:সর্বাধিক গাছ হল একটি গাছ যেখানে প্রতিটি নোডের একটি মান তার সাবট্রিতে অন্য যেকোনো মানের থেকে বেশি থাকে। ধরুন আমাদের একটি পদ্ধতি আছে যার নাম construct()। এটি একটি তালিকা A থেকে একটি রুট তৈরি করতে পারে। construct() পদ্ধতিটি −
এর মত-
তালিকা A খালি থাকলে, শূন্য ফেরত দিন।
-
অন্যথায়, A[i] কে তালিকা A এর বৃহত্তম উপাদান হতে দিন। তারপর A[i] মান সহ একটি রুট নোড তৈরি করুন।
-
মূলের বাম সন্তানটি গঠন করা হবে([A[0], A[1], ..., A[i-1]])
-
মূলের ডান সন্তানটি গঠন করা হবে ([A[i+1], A[i+2], ..., A[n - 1]]) [n হল A এর দৈর্ঘ্য]
-
রিটার্ন রুট।
মনে রাখবেন যে আমাদের সরাসরি A দেওয়া হয়নি, শুধুমাত্র একটি রুট নোড root =construct(A)। এখন ধরুন B হল A এর একটি কপি যার সাথে ভ্যালু যোগ করা হয়েছে। এটা নিশ্চিত যে B-এর অনন্য মান আছে। আমাদের (B) নির্মাণ করতে হবে। যদি মান 5 হয় এবং ইনপুট ট্রি −
এর মত হয়
আউটপুট ট্রি হল −
এর মত
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি পুনরাবৃত্ত পদ্ধতি সমাধান () সংজ্ঞায়িত করুন। এটি রুট এবং ভ্যাল নিচ্ছে
-
যদি ট্রি খালি থাকে, তাহলে মান ভ্যাল সহ একটি নতুন নোড তৈরি করুন এবং সেই নোডটি ফেরত দিন
-
যদি রুটের মান
-
temp :=নতুন নোড যার মান হল val
-
টেম্পের বামে :=রুট
-
রিটার্ন টেম্প
-
-
মূলের অধিকার :=সমাধান করুন(মূলের ডান, ভাল)
-
রিটার্ন রুট
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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 tree_level_trav(TreeNode*root){ if (root == NULL) return; cout << "["; queue<TreeNode *> q; TreeNode *curr; q.push(root); q.push(NULL); while (q.size() > 1) { curr = q.front(); q.pop(); if (curr == NULL){ q.push(NULL); } else { if(curr->left) q.push(curr->left); if(curr->right) q.push(curr->right); if(curr == NULL || curr->val == 0){ cout << "null" << ", "; }else{ cout << curr->val << ", "; } } } cout << "]"<<endl; } class Solution { public: TreeNode* insertIntoMaxTree(TreeNode* root, int val) { if(!root)return new TreeNode(val); if(root->val < val){ TreeNode* temp = new TreeNode(val); temp->left = root; return temp; } root->right = insertIntoMaxTree(root->right, val); return root; } }; main(){ vector<int> v = {4,1,3,NULL,NULL,2}; TreeNode *root = make_tree(v); Solution ob; tree_level_trav(ob.insertIntoMaxTree(root, 5)); }
ইনপুট
[4,1,3,null,null,2] 5
আউটপুট
[5, 4, 1, 3, null, null, 2, ]