一般樹的遍歷、合併及對比
阿新 • • 發佈:2018-11-05
普通樹的遍歷、合併及對比
日常開發過程中,我們經常會碰到樹這種資料結構,譬如許可權樹、區域層級樹,系統呼叫鏈等等,今天想記錄一下在某個面試題中碰到的關於樹的演算法題,通過對該題的解答鞏固自身對於資料結構的理解,以及希望給有相同困惑的小夥伴以參考的作用。閒話不多說,我們來看題(如涉及到洩題,還請聯絡我予以刪除)
題目描述
如下圖所示,可近似看作系統的一個呼叫鏈,A為請求的閘道器,隨著業務的不斷拓展,系統呼叫鏈結構會慢慢發生變化,逐漸從形態一演化到形態二,經過相應的系統重構及鏈路優化後:
- 系統E下線
- 系統b、f、H、I上線,且系統F掛載到了新的中間業務系統b下
請對兩顆樹:先行分別計算高度、統計結點總數,然後進行合併處理,同時計算並輸出對比結果
程式設計要求
寫一個樹合併和對比的工具類:
1. 計算樹的高度、總結點數
2. 合併兩顆樹
3. 輸出兩顆樹的對比結果
- ADD : b、f、H、I
- DELETE : E
解題分析
根據題目描述,我們發現題中所描述的資料結構為一顆普通的樹,我們建立一顆普通樹的資料結構並不難。根據描述,我們也不難猜出需要採用遞迴的方式來解題。分析一下可能存在的難點:
- 普通樹的遞迴遍歷如何實現,遍歷後如何取得最深的路徑(即樹高)
- 兩棵樹進行合併時,如何處理兩樹節點不平衡問題,以及單節點合併後子節點的合併順序問題,採用何種遍歷方式更合適的問題
- 對於兩棵樹的比較,假設一個節點被重複掛在了多個節點上,是否判斷為新增,統計規則不同,採取的策略也有所不同
- 生成合並樹時,在判斷去重時,注意去重採取的規則
附上已實現的原始碼,感興趣的同學可直接點選連結下載:普通樹的遍歷、合併及對比