1. 程式人生 > >Java求解樹結構各節點值:遞迴方法

Java求解樹結構各節點值:遞迴方法

        最近在做公司專案的時候,遇到了這樣的一個需求,本人將需求進行了簡化:已知一個樹形結構的list,並且已知根節點的id和value以及每一個節點的rate和pid,要求算出每一個節點的value,前提是不知道樹結構總共有幾級節點。

        這裡很明顯需要用到遞迴演算法了,什麼叫遞迴演算法,遞迴演算法就是函式自己呼叫自己的演算法,為什麼要用遞迴演算法,因為樹結構不明確,在不知道樹結構有幾級或者已知樹結構大於等於三級的情況下,個人推薦優先使用遞迴演算法,遞迴演算法節省程式程式碼量,優化額程式碼的設計,缺點是設計起來較為複雜,對邏輯思維要求較高,而且會佔用額外的棧空間。

        程式碼如下:

public void saveorupdate(List<Tree> trees,String fjd,Double sum){
    for(Tree tree:trees){
        if(tree.getPid().equals(fjd)){
            tree.setZl(sum*tree.getRate());
            saveorupdate(trees,tree.getId(),tree.getZl());
        }
    }
}

       如程式碼所示,定義saveorupdate方法的時候,在方法內部也呼叫了該方法本身,只不過在方法內部要加上條件判斷,並且在呼叫方法的時候,修改了傳入引數。

       這裡的條件判斷,是為了收束樹結構的發散,如果沒有條件限制,會出現死迴圈的現象,而修改傳入引數資訊,則是為了計算之後葉子結點的資訊。

       如此首次傳入的fjd值為根節點的id,此後一旦遍歷到一節葉子節點的時候,就會將求出值賦給該葉子,同時以該葉子為根繼續呼叫該方法,直到該葉子下所有的節點統統計算完畢,再繼續執行第二個一級節點的計算,直到計算出所有的節點資訊。

       相信一定會有更好的解決辦法或者更高效簡潔的遞迴演算法,只不過本人初入職場,仍為計算機小白,一邊工作一邊繼續學習,將工作中學到的東西記錄下來,方便以後的查閱,有不正確的地方,也歡迎大家提出指正,相互學習。