1. 程式人生 > >一般樹的遍歷、合併及對比

一般樹的遍歷、合併及對比

普通樹的遍歷、合併及對比

日常開發過程中,我們經常會碰到這種資料結構,譬如許可權樹、區域層級樹,系統呼叫鏈等等,今天想記錄一下在某個面試題中碰到的關於樹的演算法題,通過對該題的解答鞏固自身對於資料結構的理解,以及希望給有相同困惑的小夥伴以參考的作用。閒話不多說,我們來看題(如涉及到洩題,還請聯絡我予以刪除)

題目描述

如下圖所示,可近似看作系統的一個呼叫鏈,A為請求的閘道器,隨著業務的不斷拓展,系統呼叫鏈結構會慢慢發生變化,逐漸從形態一演化到形態二,經過相應的系統重構及鏈路優化後:

  • 系統E下線
  • 系統b、f、H、I上線,且系統F掛載到了新的中間業務系統b下

請對兩顆樹:先行分別計算高度、統計結點總數,然後進行合併處理,同時計算並輸出對比結果
這裡寫圖片描述

程式設計要求

寫一個樹合併和對比的工具類:
1. 計算樹的高度、總結點數
2. 合併兩顆樹
3. 輸出兩顆樹的對比結果

  • ADD : b、f、H、I
  • DELETE : E

解題分析

根據題目描述,我們發現題中所描述的資料結構為一顆普通的樹,我們建立一顆普通樹的資料結構並不難。根據描述,我們也不難猜出需要採用遞迴的方式來解題。分析一下可能存在的難點:

  • 普通樹的遞迴遍歷如何實現,遍歷後如何取得最深的路徑(即樹高)
  • 兩棵樹進行合併時,如何處理兩樹節點不平衡問題,以及單節點合併後子節點的合併順序問題,採用何種遍歷方式更合適的問題
  • 對於兩棵樹的比較,假設一個節點被重複掛在了多個節點上,是否判斷為新增,統計規則不同,採取的策略也有所不同
  • 生成合並樹時,在判斷去重時,注意去重採取的規則

附上已實現的原始碼,感興趣的同學可直接點選連結下載:普通樹的遍歷、合併及對比