導讀:最近有一個解析樹的業務,之前參加過藍橋杯算法比賽學過一些算法。(還好沒有全部忘記哈哈)怕以后忘記這種思路特寫此博文。
一、深度優先,記得廣告中經常聽到過,抱着試試看的態度買了3個療程,效果不錯........ 也經常聽人說過什么車到山前必有路,船到橋頭自然直。哈哈,這種思想就是回溯思想,也可稱為試探思想。
二、業務需求
1.這里我就舉一個其他的使用場景,我們要獲取一遍文章的評論信息,評論是聯級模式。我們現在要把數據解析成有數據結構的樹方便前端解析。
2.
CommentId | 評論表主鍵 |
ParentCommentId | 二級評論主鍵 蓋樓式 |
TopCommentId | 最上級評論的主鍵 |
ArticleId | 文章主鍵 |
三、數據解析
1.現在我們通過文章查詢到了所有評論但是沒有任何結構返回到前端去,小麗師姐還不弄死我呀,但是現在我們知道我們所有的數據有主從關系,只需要我們按照關系拼接好返回就可以了
2.查詢數據我就不演示了,直接進行數據組裝,我們現在知道每條數據都有一個父級ID,如果父級ID是空就代表他是頂級評論,就看它有沒有子級評論信息。邏輯比較簡單但是大家可以自行發散思維。
四、有請代碼神君
1.這里主要是用了深度優先搜索代碼可以看出現非常簡介,一直找自己有沒有子級評論信息。
/// <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; }