以選定的節點重新指定整棵樹的父節點。
樹是一種特殊的圖,其中所有節點都互相連通,但沒有任何環。 也就是說,任兩個節點之間都恰好只有一條路徑。
這個練習的重點,就是把樹重新定向,讓我們能從不同的角度來看待它。 舉例來說,家族樹通常是從祖先的角度來呈現:
+------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。
這個練習會拿到一棵輸入的樹,並從其中某個節點的角度將它重新定向。
測試程式會透過反覆呼叫可變參數的New函式來建立樹。
例如,以下敘述
tree := New("a",New("b"),New("c",New("d")))
會建構出以下的樹:
"a"
|
-------
| |
"b" "c"
|
"d"
你可以假設測試用的樹不會有重複的值。
測試程式會使用Value和Children方法來拆解樹。
在開始這個練習有趣的部分之前,基本的樹建構與拆解必須先能運作,因此這部分會在前 3 個測試中分開測試。
FromPov和PathTo方法是這個練習有趣的部分。
FromPov方法接受一個字串引數from,它透過節點的值來指定樹中的某個節點。
它應該回傳一棵樹,其根節點的值為from。
你可以修改原始的樹並回傳它,或是建立一棵新的樹再回傳。
如果你回傳新的樹,你可以任意取用或銷毀原始的樹。
當然,能讓它保持不變是比較好的。
PathTo方法接受 2 個字串引數from和to,它們透過節點的值來指定樹中的 2 個節點。
它應該回傳樹中從第一個節點到第二個節點的最短路徑。