導讀:最近有一個解析樹的業務,以前參加過藍橋杯算法比賽學過一些算法。(還好沒有所有忘記哈哈)怕之後忘記這種思路特寫此博文。前端
1、深度優先,記得廣告中常常聽到過,抱着試試看的態度買了3個療程,效果不錯........ 也常常聽人說過什麼車到山前必有路,船到橋頭天然直。哈哈,這種思想就是回溯思想,也可稱爲試探思想。算法
2、業務需求數據結構
1.這裏我就舉一個其餘的使用場景,咱們要獲取一遍文章的評論信息,評論是聯級模式。咱們如今要把數據解析成有數據結構的樹方便前端解析。this
2.spa
CommentId | 評論表主鍵 |
ParentCommentId | 二級評論主鍵 蓋樓式 |
TopCommentId | 最上級評論的主鍵 |
ArticleId | 文章主鍵 |
3、數據解析.net
1.如今咱們經過文章查詢到了全部評論可是沒有任何結構返回到前端去,小麗師姐還不弄死我呀,可是如今咱們知道咱們全部的數據有主從關係,只須要咱們按照關係拼接好返回就能夠了code
2.查詢數據我就不演示了,直接進行數據組裝,咱們如今知道每條數據都有一個父級ID,若是父級ID是空就表明他是頂級評論,就看它有沒有子級評論信息。邏輯比較簡單可是你們能夠自行發散思惟。blog
4、有請代碼神君get
1.這裏主要是用了深度優先搜索代碼能夠看出現很是簡介,一直找本身有沒有子級評論信息。io
/// <summary> /// 組合評論信息 /// </summary> /// <param name="comments">評論池</param> /// <param name="thisCommentModel">當前要找下級的評論</param> void CombinationComment(List<CommentModel> comments, CommentModel thisCommentModel) { //深度搜索返回 comments.ForEach(x => { if (x.Parentcommentid == thisCommentModel.Commentid) { //commentModels這是表明子級評論List<CommentModel>類型 thisCommentModel.commentModels.Add(x); comments.Remove(x); CombinationComment(comments, x); } }); }
2.第二種方法,經過多建立幾個空間進行數據解析
/// <summary> /// 返回樹形結構評論 /// </summary> /// <param name="comments">評論池</param> /// <returns></returns> List<CommentModel> CombinationComment(List<CommentModel> comments) { //返回樹 List<CommentModel> result = new List<CommentModel>(); //處理字典 Dictionary<int, CommentModel> pairs = new Dictionary<int, CommentModel>(); //存放字典 comments.ForEach(x => { pairs.Add(x.Commentid, x); }); //解析樹 comments.ForEach(x => { //判斷是否是存在父級 if (pairs.ContainsKey(x.Parentcommentid.Value)) { pairs[x.Parentcommentid.Value].commentModels.Add(x); } }); return result; }