树状解析之深度优先算法(一)
晨曦001 人气:1导读:最近有一个解析树的业务,之前参加过蓝桥杯算法比赛学过一些算法。(还好没有全部忘记哈哈)怕以后忘记这种思路特写此博文。
一、深度优先,记得广告中经常听到过,抱着试试看的态度买了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; }
加载全部内容