題目連結:
題目大意:
給定一正整數 N ,代表有 N 個測試資料。每個測試資料的第一列給定一正整數 m (1 ≦ m ≦ 80),代表有一棵樹節點數為 m 個。接下來的 m 列,每列有兩正整數 i 、 j (給定格式為i,j),代表節點 i 的父節點為 j 且若 i 為根節點的話,j = 99。
對於每棵樹,求從葉節點到根節點的路徑(不含葉節點和根節點本身)。若路徑上沒有任何內部節點,則輸出「N」;不然,輸出中間經過的節點。輸出格式參見範例輸出。
2
7
0,99
1,3
2,3
3,5
4,6
5,0
6,5
4
0,99
1,0
2,0
3,0
1:{3,5}
2:{3,5}
4:{6,5}
1:N
2:N
3:N
在輸入的時候就紀錄誰是根節點且紀錄各個節點的子節點與父節點。
輸入結束後便從根節點開始遞迴(採取深度優先搜尋(DFS)的方式)一直往葉節點的方向前進。一旦遇到葉節點(沒有子節點的節點),則開始往回(不是遞迴往回)走到根節點,並記錄走過的節點(但要記得挑掉葉節點和根節點本身)。將走過的節點之紀錄存起來,以便之後輸出,並將當前節點設為葉節點(用一布林值表示等等)。
最後,依編號順序跑過一次,判斷哪些是剛剛找到的葉節點。找到之後,就照著輸出格式輸出節點編號和路徑,但是如果路徑為空(沒有經過內部節點),則輸出「N」。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。