切換
舊版
前往
大廳
主題

ZeroJudge - c101: 00122 - Trees on the level 解題心得

Not In My Back Yard | 2020-08-05 00:00:07 | 巴幣 0 | 人氣 296

題目連結:


題目大意:
輸入有筆測試資料。每筆測資由多個「(n,s)」形式的東西組成(以一對空的括號「()」代表該測資的結尾), n 是一正整數、 s 是一字串,其代表著一個二元樹上的節點(節點數最少 1 個,最多 256 個)。而 s 只由字元「L」、「R」組成,代表從根節點到該節點的路徑(由左到右代表每往下一層該往左還是往右)。

先判斷給定的二元樹完不完整(可以藉由任一種尋訪跑遍所有給定的節點),或是有沒有節點被重複給定(有兩個節點有同一個字串 s)。如果這不是一棵合法的二元樹,則輸出「not complete」。如果合法,則對該樹進行階層探訪(Level-Order Traversal),即輸出順序為由低(越靠近根節點)到高(越靠近葉節點)、同一階層的由左至右輸出。



範例輸入:
(11,LL) (7,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
(11,LL) (7,LLL) (2,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()


範例輸出:
5 4 8 11 13 4 7 2 1
not complete
not complete


解題思維:
由於不知道給定的樹之結構,因此最好使用連結串列(Link List)來實作二元樹。首先對於每筆測資先建出一個根節點(這邊不代表它必定存在於給定的節點裡,只是先給個位置而已),然後根據每個節點的字串 s 依序往左、往右地走去該節點應該在的位置。如果路途中有遇到還不存在的節點之位置,就建立一個節點給該位置(同樣也不代表存在)。

當碰到節點應在的位置,此時該節點才是真的存在(可以用一個布林變數表示,同時也可以作為該節點有沒有被重複給定的問題之解決方案),並設定該節點的值。

將所有給定的節點放置於定位後,就遍歷這棵樹一次,看看遍歷的路徑上經過的節點數是否等於給定的數量。如果不等於,就代表這棵樹不完整,或是有重複位置的節點,此時輸出「not complete」。

如果這棵樹是完整的,此時再進行階層探訪。可以使用一個佇列(Queue),儲存「看到」的節點(一開始就先丟根節點進去)。對於每個從佇列移出來的節點(一樣,最一開始是根節點),然後該節點有無左、右節點。有的話,就將左或右(兩者皆有,則要先左後右)放入佇列裡。這樣子同階層的走完之後才會換下一個階層,且同階層的還會是由左至右地探訪。然後在遍歷樹的過程輸出碰到的節點之值即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作