मान लीजिए हमारे पास एक अधिकतम ट्री का रूट नोड है: अधिकतम ट्री एक ट्री है जहां प्रत्येक नोड का मान उसके सबट्री में किसी भी अन्य मान से अधिक होता है। मान लीजिए हमारे पास construct() नामक एक विधि है। यह सूची A से एक रूट बना सकती है। construct() विधि इस तरह है:
यदि सूची A खाली है, तो null लौटाएं।
अन्यथा, मान लें कि A[i] सूची A का सबसे बड़ा तत्व है। फिर मान A[i] के साथ एक रूट नोड बनाएं।
रूट का लेफ्ट चाइल्ड construct([A[0], A[1], ..., A[i-1]]) होगा
रूट का राइट चाइल्ड construct([A[i+1], A[i+2], ..., A[n - 1]]) होगा [n, A की लंबाई है]
रूट लौटाएं।
ध्यान दें कि हमें A सीधे नहीं दिया गया था, केवल एक रूट नोड root = construct(A) दिया गया था। अब मान लीजिए B, A की एक प्रति है जिसमें मान val जोड़ा गया है। यह गारंटी है कि B में अद्वितीय मान हैं। हमें construct(B) बनाना है। यदि मान 5 है और इनपुट ट्री इस तरह है:

आउटपुट ट्री इस तरह है:

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
एक रिकर्सिव विधि solve() परिभाषित करें। यह रूट और val ले रही है
यदि ट्री खाली है, तो मान val के साथ एक नया नोड बनाएं, और उस नोड को लौटाएं
यदि रूट का मान < val है, तो
temp := नया नोड जिसका मान val है
temp का लेफ्ट := रूट
temp लौटाएं
रूट का राइट := solve(रूट का राइट, 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;
}
};
int 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, ]