選んだノードを根として、ツリーの親子関係を組み替えます。
ツリーは特殊なグラフの一種で、すべてのノードがつながっていますが、閉路はありません。 つまり、どの2つのノードの間にも、経路がちょうど1つだけあります。
この演習のテーマは、ツリーの向きを変えて、別の視点から物事を見ることです。 たとえば、家系図はふつう、先祖の視点から表されます。
+------0------+
| | |
+-1-+ +-2-+ +-3-+
| | | | | |
4 5 6 7 8 9
しかし、ツリーにもともと決まった向きはありません。 ツリー内のほかの任意のノードを根に引き上げ、そのつながりも一緒に動かせば、同じ情報でも、そのノードの視点から表すことができます。 すると、同じツリーを6の視点から見ると、次のようになります。
6
|
+-----2-----+
| |
7 +-----0-----+
| |
+-1-+ +-3-+
| | | |
4 5 8 9
こうすると、2つのノードの間の経路を、より簡単に説明できるようになります。 たとえば、6から9への経路(最初のツリーでは、いったん根まで上がってから別の葉ノードへ下っていく経路)は、6-2-0-3-9という経路をたどっていることがわかります。
この演習では、入力として与えられたツリーを、どれか1つのノードの視点から向きを変えます。
ときには、例外を発生させる必要があります。その際は、エラーの原因を示す意味のあるエラーメッセージを必ず含めるようにしましょう。そうするとコードが読みやすくなり、デバッグもずっと楽になります。エラーの原因がある型だとわかっている場合は、組み込みのエラータイプのいずれかを発生させることもできますが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、raise文を使って、Tree()クラスに再配置できないツリーが渡された場合や、start nodeとend nodeのあいだに経路が見つからない場合に、複数のValueErrorsを「投げる」必要があります。
テストに通るのは、期待されるexception型をraiseし、それに期待されるメッセージを含めた場合だけです。
テストとその期待される結果をよく確認してください。