10410 Tree Reconstruction
阿新 • • 發佈:2018-12-18
此題感慨良多。
首先,我看到這個題我是覺得題意簡單好懂,但是恰恰最開始就把我搞糊塗了。
輸入:第一行 節點數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序中不相鄰