导读:最近有一个解析树的业务,以前参加过蓝桥杯算法比赛学过一些算法。(还好没有所有忘记哈哈)怕之后忘记这种思路特写此博文。前端
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; }