درخت را روی یک گرهی انتخابشده دوباره والدگذاری کنید.
یک درخت نوع خاصی از گراف است که در آن همهی گرهها به هم متصلاند اما هیچ دوری وجود ندارد. یعنی برای هر جفت گره، دقیقاً یک مسیر برای رفتن از یک گره به گره دیگر وجود دارد.
این تمرین تماماً دربارهی جهتدهی دوبارهی یک درخت است تا از دیدگاهی متفاوت به آن نگاه کنید. برای مثال، شجرهنامهها معمولاً از دیدگاه نیاکان نمایش داده میشوند:
+------0------+
| | |
+-1-+ +-2-+ +-3-+
| | | | | |
4 5 6 7 8 9
اما هیچ جهت ذاتی در درخت وجود ندارد. همین اطلاعات را میتوان از دیدگاه هر گرهی دیگر در درخت نمایش داد، به این ترتیب که آن را تا ریشه بالا میکشیم و روابطش را هم همراه با آن میکشیم. بنابراین همان درخت از دیدگاه ۶ به این شکل خواهد بود:
6
|
+-----2-----+
| |
7 +-----0-----+
| |
+-1-+ +-3-+
| | | |
4 5 8 9
این کار به ما اجازه میدهد مسیرهای بین دو گره را سادهتر توصیف کنیم. برای مثال، مسیر از ۶ به ۹ (که در درخت اول تا ریشه بالا میرود و سپس تا یک گره برگ دیگر پایین میآید) دیده میشود که مسیر ۶-۲-۰-۳-۹ را دنبال میکند.
این تمرین شامل گرفتن یک درخت ورودی و جهتدهی دوبارهی آن از دیدگاه یکی از گرهها است.
گاهی لازم است استثنایی ایجاد کنید. وقتی این کار را میکنید، باید همیشه یک پیام خطای معنادار بنویسید که منبع خطا را نشان دهد. این کار code شما را خواناتر میکند و به میزان چشمگیری به debug کردن کمک میکند. در موقعیتهایی که میدانید منبع خطا از نوع مشخصی خواهد بود، میتوانید یکی از انواع خطای توکار را raise کنید، اما همچنان باید پیام معناداری هم همراه آن بیاورید.
این تمرین بهطور خاص از شما میخواهد که از دستور raise استفاده کنید تا اگر به کلاس Tree() درختی داده شود که نمیتوان دوباره جهتدهیاش کرد، یا مسیری بین یک start node و یک end node پیدا نشود، چندین ValueErrors را «پرتاب» کنید.
tests تنها در صورتی قبول میشوند که هم نوع exception مورد انتظار را raise کنید و هم پیام مورد انتظار را همراه آن بیاورید.
لطفاً tests و نتایج مورد انتظارشان را با دقت بررسی کنید.