এন-অ্যারি ট্রি (N-ary Trees)
এন-অ্যারি ট্রি (N-ary tree) হলো এমন এক ধরনের ট্রি, যেখানে একটা নোডের যত খুশি তত সংখ্যক বাচ্চা বা চাইল্ড থাকতে পারে — শুধু দুটো নয়। বাইনারি ট্রিতে যেমন নিয়ম থাকে যে একটা বাপের সর্বোচ্চ দুটোই বাচ্চা (ডান আর বাঁ) থাকতে পারবে, এন-অ্যারি ট্রিতে এমন বাঁধার কোনো বালাই নেই।
আমাদের দৈনন্দিন জীবনে এর ভুরি ভুরি উদাহরণ আছে:
- ফাইল সিস্টেম (File system) — একটা ফোল্ডারের ভেতর যেকোনো সংখ্যক ফাইল বা সাব-ফোল্ডার থাকতে পারে।
- এইচটিএমএল ডম (HTML DOM) — একটা
<div>ট্যাগের ভেতর ডজনখানেক চাইল্ড এলিমেন্ট থাকতে পারে। - ট্রাই (Trie) — স্ট্রিং প্রিফিক্স সার্চের জন্য বিশেষায়িত আরেকটি এন-অ্যারি ট্রি।
- কোম্পানির অর্গানোগ্রাম (Org chart) — একজন ম্যানেজারের আন্ডারে যেকোনো সংখ্যক কর্মী কাজ করতে পারে।
- কমেন্ট থ্রেড (Comment threads) — ফেসবুকে বা ব্লগে একটা কমেন্টের নিচে যত্তো খুশি রিপ্লাই পড়া সম্ভব।
- জেসন/এক্সএমএল (JSON/XML) — এগুলোর নোডেও যেকোনো সংখ্যক চাইল্ড থাকতে পারে।
এর ভেতরের স্ট্রাকচার কেমন?
একটা এন-অ্যারি নোড দেখতে সাধারণত এরকম হয়:
এই children লিস্টটা দরকারের সময় নিজে নিজেই বড় হয় — একটা নোডের যদি ৩টা বাচ্চা থাকে, তবে ওই লিস্টে ৩ জনের রেফারেন্স থাকবে। আর লতা বা পাতা (leaf node)-র ক্ষেত্রে এই লিস্টটা একদম ফাঁকা থাকে।
← → অ্যারো কি (arrow key) ব্যবহার করুন · উপাদানগুলোতে ক্লিক করুন
এন-অ্যারি ট্রিতে ঘোরার উপায় (Traversing)
বাইনারি ট্রির মতোই এখানে ঘোরাঘুরি বা ট্রাভার্স করার নিয়ম একই, শুধু পয়েন্টার দুটোর বদলে লিস্ট ধরে আগাতে হয়:
প্রি-অর্ডার (Pre-order / DFS)
আগে বর্তমান বা বাপ নোডটাকে দেখুন, তারপর তার সব বাচ্চাদের সিরিয়াল অনুযায়ী একে একে দেখতে থাকো:
পোস্ট-অর্ডার (Post-order / DFS)
আগে সবগুলো বাচ্চার কাজ শেষ করুন, তারপর বর্তমান বা বাপ নোডের কাছে আসুন:
লেভেল-অর্ডার (Level-order / BFS)
একটা কিউ (queue) ব্যবহার করে একদম লেভেল বা তলা ধরে ধরে আগানো — এটা বাইনারি ট্রির বিএফএস-এর (BFS) মতোই, শুধু লুপ চালিয়ে ২টার বদলে সব বাচ্চাকে কিউতে ঢোকাতে হয়:
সিরিয়ালাইজেশন (Serialization)
একটা এন-অ্যারি ট্রিকে হার্ডডিস্কে সেভ করতে বা ইন্টারনেটে পাঠাতে গেলে তাকে সিরিয়ালাইজ (serialize) বা স্ট্রিং বানাতে হয়। একটা কমন স্টাইল হলো: আগে নোডের ভ্যালু, তারপর তার কয়টা বাচ্চা আছে সেই সংখ্যাটা লেখা। আরেকটা উপায় হলো: লেভেল-অর্ডার করে স্পেশাল একটা 'নাল (null)' মার্কার দিয়ে ভাইবোনদের বা বাচ্চাদের লিস্ট আলাদা করা (লিটকোড (LeetCode)-এ সাধারণত এই স্টাইলটাই ব্যবহার করা হয়)।
এন-অ্যারি ট্রি বনাম বাইনারি ট্রি
কখন কোনটা ব্যবহার করবেন?
- বাইনারি ট্রি ব্যবহার করবেন যখন প্রবলেমে কোনো কিছুর স্পষ্ট "দুই ভাগ (two-way split)" থাকবে (যেমন: ছোট/বড়, হ্যাঁ/না), অথবা যখন আপনার বাইনারি সার্চ ট্রি (BST)-এর মতো কোনো স্পেশাল সার্চ সুবিধার দরকার হবে।
- এন-অ্যারি ট্রি ব্যবহার করবেন যখন বাস্তবেই কোনো কিছুর অসংখ্য বাচ্চা থাকার সম্ভাবনা থাকে (যেমন: ফাইল সিস্টেম, কোম্পানির চার্ট, বা এইচটিএমএল ডম)।
উচ্চতা (Height) বা গভীরতা (Depth)
ডালপালা বা ব্রাঞ্চিং ফ্যাক্টর (branching factor) যদি k হয়, তবে একটা ব্যালান্সড এন-অ্যারি ট্রির উচ্চতা হয় O(log_k n) — যেটা বাইনারি ট্রির O(log₂ n)-এর চেয়ে অনেক অনেক ছোট হতে পারে। ধরুন ফোল্ডারের গড় সাইজ ২০ (branching factor 20), এমন একটা ফাইল সিস্টেমে মাত্র ৪-৫ লেভেলের উচ্চতাতেই লাখ লাখ ফাইল ধরে যায়!