ভাবুন, আপনাকে একটি বাইনারি ট্রি Alpha Centauri-র দিকে এগিয়ে আসা একটি স্যাটেলাইটে পাঠাতে হবে, আর আপনার ব্যান্ডউইথ সীমিত। যেহেতু এই ট্রিতে কোনো পুনরাবৃত্ত আইটেম নেই, তাই এর প্রি-অর্ডার ও ইন-অর্ডার ট্রাভার্সাল দিয়েই এটিকে অনন্যভাবে উপস্থাপন করা যায়।
ট্রাভার্সালগুলো থেকে ট্রিটি পুনর্গঠন করার জন্য স্যাটেলাইটের সফটওয়্যারটি লিখুন।
একটি প্রি-অর্ডার ট্রাভার্সাল বাম সাবট্রি প্রি-অর্ডারে পড়ার আগে (তাই "pre") বর্তমান নোডের মান পড়ে। এরপর ডান সাবট্রি প্রি-অর্ডারে পড়া হয়।
একটি ইন-অর্ডার ট্রাভার্সাল প্রথমে বাম সাবট্রি ইন-অর্ডারে, তারপর বর্তমান নোড এবং সবশেষে ডান সাবট্রি ইন-অর্ডারে পড়ে। অর্থাৎ বাম থেকে ডানে ক্রমানুসারে।
উদাহরণস্বরূপ, এই ট্রিটির প্রি-অর্ডার ট্রাভার্সাল হলো [a, i, x, f, r]. এই ট্রিটির ইন-অর্ডার ট্রাভার্সাল হলো [i, a, f, x, r]
a
/ \
i x
/ \
f r
দ্রষ্টব্য: প্রি-অর্ডার ট্রাভার্সালের প্রথম আইটেমটি সর্বদাই রুট।
কখনও কখনও এক্সেপশন রেইজ করা প্রয়োজন হয়। এটি করলে, এররটির উৎস কী তা বোঝাতে সবসময় একটি অর্থবহ এরর মেসেজ যুক্ত করা উচিত। এতে আপনার কোড আরও পাঠযোগ্য হয় এবং ডিবাগিংয়ে অনেকটাই সাহায্য করে। যে ক্ষেত্রে আপনি জানেন এররটির উৎস একটি নির্দিষ্ট টাইপ হবে, সেখানে বিল্ট-ইন এরর টাইপগুলোর একটি রেইজ করা বেছে নিতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যুক্ত করা উচিত।
এই নির্দিষ্ট অনুশীলনীতে raise স্টেটমেন্ট ব্যবহার করে একটি ValueError "থ্রো" করতে বলা হয়েছে, যদি preorder এবং inorder আর্গুমেন্ট দৈর্ঘ্যে বা এলিমেন্টে অমিল হয়, কিংবা এলিমেন্টগুলো ইউনিক না হয়। আপনি যদি raise করেন এবং এর সাথে একটি মেসেজও যুক্ত করেন, তবেই টেস্টগুলো পাস করবে।
একটি মেসেজসহ ValueError রেইজ করতে, মেসেজটি exception টাইপের আর্গুমেন্ট হিসেবে লিখুন:
# if preorder and inorder are not the same length
raise ValueError("traversals must have the same length")
# if preorder and inorder do not share the same elements
raise ValueError("traversals must have the same elements")
# if element repeat (are not unique)
raise ValueError("traversals must contain unique items")
Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।