1. 程式人生 > >10410 Tree Reconstruction

10410 Tree Reconstruction

此題感慨良多。

首先,我看到這個題我是覺得題意簡單好懂,但是恰恰最開始就把我搞糊塗了。

輸入:第一行 節點數n、第二行 bfs序列,第三行 dfs序列。

輸出:輸出最初看不懂,原題是真的讀不懂= =|||。看了好幾遍書上的題目,才注意到輸出的是編號n的子節點,例如 編號4有子節點3、5 那麼 4: 3 5。

題意還容易誤解,在此強調,以免後來者和我犯一樣的錯誤。

誤解1:這棵樹是一個二叉樹(從來沒說過,不要先入為主)。

誤解2:樹的節點是先訪問先輸出(bfs和dfs序和我們要輸出的答案都是升序的)(不要漏看題意)。

我剛開始想的是和先序和中序一樣,一個個確定根節點遞迴實現,後來不管怎麼想都覺得難以實現。

最後確實是苦讀部落格(感謝大佬QAQ)才勉強寫完。

我們可以發現以下幾件事情

1.bfs序列中相鄰的u和v可能是兄弟節點,dfs序列中相鄰的u和v可能是父子節點。

2.因為一個節點按升序展開,所以兄弟節點u和v,u<v,在bfs節點中,就會有u和v相鄰,且輸入是v緊跟u,以及u<v。

3.我們現在知道了2這件事情,那麼如果bfs序列中有一個v緊跟u,但是u>v,這意味著什麼?這意味著v不是u的兄弟節點,所以v是一個子節點,是u的第一個兄弟節點的子節點。

4.dfs序列中,相鄰的u和v可能是父子節點,所以如果有u和v滿足3而且在dfs序列中相鄰,那麼v是u的子節點。

5.如果兩個節點u和v是兄弟節點那麼在bfs序中一定是相鄰的。

瞭解了以上情況,我們可以的到可以判斷子節點的幾個條件

1.bfs序中節點u,緊跟節點u的v,u>v

2.dfs序中節點u,緊跟節點u的v,在bfs序中不相鄰