把树重新挂到选定的节点上。
树是一种特殊的图,其中所有节点都相连,但不存在环。 也就是说,任意两个节点之间有且只有一条路径。
这道练习的重点,就是把树重新定向,从另一个角度来观察它。 比如,家谱通常是从祖先的角度来呈现的:
+------0------+
| | |
+-1-+ +-2-+ +-3-+
| | | | | |
4 5 6 7 8 9
但树本身并没有固定的方向。 把树中的任意一个其他节点提到根的位置,连同它的关系一起拖动,就能从那个节点的角度呈现同样的信息。 所以,同一棵树从节点 6 的角度看是这样的:
6
|
+-----2-----+
| |
7 +-----0-----+
| |
+-1-+ +-3-+
| | | |
4 5 8 9
这样一来,我们就能更简单地描述两个节点之间的路径。 比如,从 6 到 9 的路径(在第一棵树中,它先向上到根,再向下到另一个叶节点)可以看作沿着路径 6-2-0-3-9 走。
这道练习要求你拿到一棵输入的树,并从其中一个节点的视角把它重新定向。
有时需要抛出异常。这样做时,你应该始终包含一条有意义的错误消息,说明错误的来源。这能让你的代码更易读,也能大大帮助调试。如果你知道错误来源属于某个确定的类型,可以选择抛出内置错误类型中的一种,但依然应该包含一条有意义的消息。
本练习要求你使用 raise 语句,在 Tree() 类被传入一棵无法重新定向的树,或在 start node 和 end node 之间找不到路径时,“抛出”多个 ValueErrors。
只有当你既 raise 了预期的 exception 类型,又附带了预期的消息时,测试才会通过。
请仔细查看测试及其预期结果。