多樹表,遞歸查找所有分支及葉子的根

場景

  • 背景
    數據庫中有一張存儲樹結構的表,表中有子節點(childId)和父節點(parentId)對應關系的字段。表中存儲多棵樹的數據,每棵樹的根節點(rootId)的特點是:childId與parentId相等。數據如下圖:
Paste_Image.png
  • 需求
    表中每棵樹都可能有多級分支及多個葉子節點,需要定位出表中所有節點歸屬的樹的根節點Id,放入map中(此處為java實現),map的結構為map<childId,rootId>。最終結果如下圖:
Paste_Image.png

思路

將表數據拼接取出,然后將數據轉換為兩個數組,一個是父節點數組、一個是子節點數組,同時,提取出表中的根節點數據。
然后,對子節點數組進行遍歷,依據已經確定的根節點,遞歸查找出每個子節點的根,當子節點數據遍歷完成,則所有數據定位完成。

實現代碼

從數據庫獲取表數據,拼接成“childId,parentId”字符串。可以通過jdbc從查詢表,獲取resultSet,遍歷resultSet進行拼接,比較簡單,所以未編寫代碼。

/**
 * 多樹表,遞歸定位所有分支及葉子的根
 * @param child_parent_list
 * @author 張文健
 * @return
 */
public static Map<String,String> rootMap(List<String> child_parent_list){
    Map<String,String> child_parent_map = new HashMap<String,String>();
    String[] parentArr = new String[child_parent_list.size()];
    String[] childArr = new String[child_parent_list.size()];
    for(int i=0;i<child_parent_list.size();i++){
        String ic = child_parent_list.get(i).split(",")[0];
        String ip = child_parent_list.get(i).split(",")[1];
        parentArr[i] = ip;
        childArr[i] = ic;
        if(ic.equals(ip)){
            child_parent_map.put(ip, ip);
        }
    }
    goods: for(int i=0;i<childArr.length;i++){
            String finder = parentArr[i];
            machine: for(int j=0;j<childArr.length;j++){
                if(finder.equals(childArr[j])){
                    if(child_parent_map.containsValue(childArr[j])){
                        child_parent_map.put(childArr[i], childArr[j]);
                        continue goods;
                    }else{
                        finder = parentArr[j];
                        j=0;
                        continue machine;
                    }
                }
            }
        }
    return child_parent_map;
}

public static void main(String[] args) {
    List<String> child_parent_list = new ArrayList<String>();
    child_parent_list.add("000087,000086");
    child_parent_list.add("000088,000086");
    child_parent_list.add("000105,000088");
    child_parent_list.add("000106,000105");
    child_parent_list.add("000086,000086");
    child_parent_list.add("000091,000091");
    child_parent_list.add("000092,000091");
    child_parent_list.add("000093,000091");
    child_parent_list.add("000096,000096");
    child_parent_list.add("000097,000096");
    child_parent_list.add("000098,000096");
    child_parent_list.add("000099,000096");
    child_parent_list.add("000113,000111");
    child_parent_list.add("000112,000111");
    child_parent_list.add("000114,000111");
    child_parent_list.add("000111,000111");
    ServiceUtil.rootMap(child_parent_list);
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,480評論 1 31
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,152評論 0 12
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,759評論 18 399
  • eclipse中的配置問題會對XML進行校驗,比如DTD,不符合它規矩就要帶著紅色叉號,進行如下操作即可: 1 右...
    peppermint_egg閱讀 6,021評論 0 2
  • 我叫端木森,沒有十歲之前的記憶,也不知道自己的父母是誰。在孤兒院里長大的我,身邊的朋友總是一個接著一個死去.......
    酷聽聽書閱讀 3,919評論 0 0