কনসেপ্ট
একটি বাইনারি ট্রি দেওয়া আছে। নির্দিষ্ট ভERTICAL লেভেলটি সর্টেড (ক্রমবদ্ধ) কিনা যাচাই করুন। (দুটি নোড ওভারল্যাপ হলে ওই লেভেলে সিকোয়েন্স সর্টেড কিনা দেখুন।)
ইনপুট ১
ট্রি: 2 / \ 3 6 / \ 8 5 / 7, Level l = -1
আউটপুট ১
Yes
লেভেল -1-এ নোড: 3 -> 7 (সর্টেড)।
ইনপুট ২
ট্রি: 2 / \ 3 7 \ / 4 5, Level l = 0
আউটপুট ২
Yes
লেভেল 0-এ নোড: 2 -> 4 -> 5 (সর্টেড, 4 ও 5 ওভারল্যাপ)।
পদ্ধতি
দক্ষ সমাধান: ভERTICAL লেভেল অর্ডার ট্রাভার্সাল (BFS কিউ দিয়ে) করুন। লেভেল l-এ পাওয়া নোডগুলোর মান পূর্ববর্তী মানের চেয়ে বড় বা সমান কিনা চেক করুন। ছোট হলে false, শেষ পর্যন্ত চলে গেলে true।
উদাহরণ (C++ কোড)
// CPP: বাইনারি ট্রির ভERTICAL লেভেল সর্টেড কিনা
#include <bits/stdc++.h>
using namespace std;
struct Node1 { int key1; Node1 *left1, *right1; };
Node1* newNode(int key1) { Node1* t=new Node1; t->key1=key1; t->left1=t->right1=NULL; return t; }
bool isSorted1(Node1* root1, int level1) {
if (root1 == NULL) return true;
int prevVal1 = INT_MIN, currLevel1;
Node1* currNode1;
queue> q1;
q1.push({root1,0});
while(!q1.empty()) {
currNode1 = q1.front().first;
currLevel1 = q1.front().second;
q1.pop();
if (currLevel1 == level1) {
if (prevVal1 <= currNode1->key1) prevVal1 = currNode1->key1;
else return false;
}
if (currNode1->left1) q1.push({currNode1->left1, currLevel1-1});
if (currNode1->right1) q1.push({currNode1->right1, currLevel1+1});
}
return true;
}
int main() {
Node1* root1 = newNode(2);
root1->left1=newNode(3); root1->right1=newNode(6);
root1->left1->left1=newNode(8); root1->left1->right1=newNode(5);
root1->left1->right1->left1=newNode(7);
int level1 = -1;
cout << (isSorted1(root1,level1)?"Yes":"No");
return 0;
}
আউটপুট
Yes