树状解析之深度优先算法(一)

  导读:最近有一个解析树的业务,之前参加过蓝桥杯算法比赛学过一些算法。(还好没有全部忘记哈哈)怕以后忘记这种思路特写此博文。

一、深度优先,记得广告中经常听到过,抱着试试看的态度买了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;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值