মনে করুন একটি স্ট্রিং আছে ডট (.) এবং সংখ্যা দিয়ে, ডট বোঝায় কোষটি খালি, এবং যদি কোনো কোষে 숫자 x থাকে, তবে তা বোঝায় আমরা স্ট্রিং-এ ডান বা বামে x স্টেপ যেতে পারি। আমাদের কাজ হল চেক করা আমরা কি কোনো কোষ একাধিকবার ভিজিট করতে পারি কিনা। উদাহরণস্বরূপ, যদি স্ট্রিংটি ". 2 . . . 2 . ." হয়, তবে ৪ নম্বর কোষ দুটি ভিন্ন পথে ভিজিট করা যায়: দ্বিতীয় কোষ থেকে দু স্টেপ ডানে, অথবা ষষ্ঠ কোষ থেকে দু স্টেপ বামে।
আমরা একটি visited[] অ্যারে ব্যবহার করব যেটি ট্র্যাক রাখবে i-তম কোষ কতবার ভিজিট করা হয়েছে। এখন স্ট্রিং ট্রাভার্স করব এবং চেক করব বর্তমান ক্যারেক্টার ডট কিনা অথবা সংখ্যা। ডট হলে কিছু করব না, সংখ্যা x হলে visited অ্যারেতে রেঞ্জ [i - x, i + x]-এ ভিজিট কাউন্ট ১ বাড়াব। visited অ্যারে ট্রাভার্স করে দেখব কোনো কোষ একাধিকবার ভিজিট করা হয়েছে কিনা।
উদাহরণ কোড
#include <iostream>
#include <queue>
using namespace std;
class Node {
public:
int key;
Node *left, *right;
};
Node* getNode(int key) {
Node* newNode = new Node;
newNode->key = key;
newNode->left = newNode->right = NULL;
return newNode;
}
bool isLevelWiseSorted(Node* root) {
int prevMax = INT_MIN;
int min_val, max_val;
int levelSize;
queue<Node*> q;
q.push(root);
while (!q.empty()) {
levelSize = q.size();
min_val = INT_MAX;
max_val = INT_MIN;
while (levelSize > 0) {
root = q.front();
q.pop();
levelSize--;
min_val = min(min_val, root->key);
max_val = max(max_val, root->key);
if (root->left)
q.push(root->left);
if (root->right)
q.push(root->right);
}
if (min_val <= prevMax)
return false;
prevMax = max_val;
}
return true;
}
int main() {
Node* root = getNode(1);
root->left = getNode(2);
root->right = getNode(3);
root->left->left = getNode(4);
root->left->right = getNode(5);
root->right->left = getNode(6);
root->right->right = getNode(7);
if (isLevelWiseSorted(root))
cout << "Tree is levelwise Sorted";
else
cout << "Tree is Not levelwise sorted";
return 0;
}
আউটপুট
Tree is level wise Sorted