أعِد هيكلة خوارزمية بناء الشجرة.
تعتمد بعض المنتديات الإلكترونية على تخطيط شجري، فتُعرض المنشورات على هيئة شجرة. غير أن المنشورات تُخزَّن عادةً في قاعدة بيانات كمجموعة غير مرتبة من السجلات. لذا لا بد من إعادة بناء البنية الشجرية عند عرض المنشورات على المستخدم.
مهمتك هي إعادة هيكلة قطعة كود تعمل فعلاً لكنها بطيئة وقبيحة، وتنفّذ منطق بناء الشجرة لسجلات مجرّدة إلى حد كبير. لا تحتوي السجلات إلا على رقم معرّف ورقم معرّف أب. يقع رقم المعرّف دائمًا بين 0 (شاملًا) وطول مصفوفة السجلات (غير شامل). ولكل سجل معرّف أب أصغر من معرّفه، باستثناء السجل الجذر، فمعرّف أبيه يساوي معرّفه.
مثال على شجرة:
root (ID: 0, parent ID: 0)
|-- child1 (ID: 1, parent ID: 0)
| |-- grandchild1 (ID: 2, parent ID: 1)
| +-- grandchild2 (ID: 4, parent ID: 1)
+-- child2 (ID: 3, parent ID: 0)
| +-- grandchild3 (ID: 6, parent ID: 3)
+-- child3 (ID: 5, parent ID: 0)
تحتاج أحيانًا إلى رفع استثناء. وعندما تفعل ذلك، ينبغي أن تُضمّن دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ. فهذا يجعل الكود أكثر وضوحًا ويساعد كثيرًا في تصحيح الأخطاء. وفي الحالات التي تعرف فيها أن مصدر الخطأ سيكون من نوع معيّن، يمكنك أن تختار رفع أحد أنواع الأخطاء المدمّنة، لكن ينبغي أن تُضمّن معه رسالة ذات معنى رغم ذلك.
يتطلب هذا التمرين تحديدًا أن تعيد هيكلة الكيفية أو المكان الذي تُستخدم فيه عبارة raise "لإلقاء" ValueError عند إدخال شجرة غير صالح. لن تنجح الاختبارات إلا إذا استخدم الكود raise مع exception المناسب وأرفق معه رسالة مناسبة.
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.