关闭

树形递归遍历实现多级评论

标签: 递归算法树形遍历
1580人阅读 评论(1) 收藏 举报
分类:

最近参加了学校的网页设计大赛,做了一个论坛网站,期间后台的多级评论用了我很多时间,什么是多级评论呢,也就是针对某一条评论,其他用户都可以在该评论基础上回复对方,这样也就形成了一条树形结构,我用了递归来实现树的遍历,感觉这个算法很有用,在许多方面都有可能用到,比如说像QQListView分组显示都可以用它来实现。

具体实现思路:

1、通过构建节点来记录数据,节点要求:记录父节点;记录自身节点,记录子节点,记录节点所在树。

2、将已经记录了信息的节点保存到集合表中,对集合表进行遍历排序。

3、将排好序的集合表用于项目中遍历显示。

接下来给大家展示核心代码:

我还是来一张网站多级评论图片(嘿嘿):

这里写图片描述
一、Node类:

public class Node 
{
    private int id;//自己的id,-1时表示叶子节点
    private int p_id;//父节点id,0时表示根节点
    private int root_number;//这个是每条树的唯一标识,表示该节点所在根
    private Node parent;//记录父节点,每个节点只有一个父节点
    private List<Node> children;//记录子节点,子节点可以有多个
    //其他属性根据具体需求添加,以上都是必须的

    public Node(int id, int p_id, int root_number)
    {
        this.id = id;
        this.p_id = p_id;
        this.root_number = root_number;
    }

    public int getId()
    {
        return this.id;
    }

    public int getPId()
    {
        return this.p_id;
    }

    public int getRootNumber()
    {
        return this.root_number;
    }

    public void setParent(Node parent)
    {//设置父节点
        this.parent = parent;
    }

    public Node getParent()
    {//获取该节点的父节点
        return this.parent;
    }

    public void setChildren(Node child)
    {//记录子节点
        this.children.Add(child);
    }

    public boolisRoot()
    {//判断是否为根
        return this.p_id == 0;
    }

    public bool isLeaf()
    {//判断是否为叶子节点
        return this.id == -1;
    }

    public List<Node> getChidrenList()
    {//获取该节点的的所有子节点集合表
        return this.children;
    }

}

二、NodesHelper类:节点进行遍历排序

 public class NodesHelper
    {
        public static List<Node> getConvertNode(List<Node> list) {//对外开放接口,返回排序后的集合表
        //各节点之间建立连接关系
            connectNodes(list);
            //获取所有的根节点
            List<Node> rootNodes = getRootNodes(list);
            //建立空表,储存排序后的节点
            List<Node> result = new List<Node>();


            for (int i = 0; i < rootNodes.Count; i++)
            {//根据每个根节点,将其所属节点添加到空表中
                //递归添加节点
                addNodeToResult(result, rootNodes[i]);
            }

            return result;
        }



        private static void connectNodes(List<Node> list)
        {//各节点之间建立连接关系
            for (int i = 0; i < list.Count -1; i++)
            {
                Node nodeLast = list[i];
                for (int j = i + 1; j < list.Count; j++)
                {
                    Node nodeNext = list[j];
                    if (nodeLast.getRootNumber() == nodeNext.getRootNumber())//判断是否处于同一树
                    {
                        if (nodeNext.getPId() == nodeLast.getId())
                        {
                            nodeLast.setChildren(nodeNext);
                            nodeNext.setParent(nodeLast);
                        }
                        else if (nodeNext.getId() == nodeLast.getPId())
                        {
                            nodeNext.setChildren(nodeLast);
                            nodeLast.setParent(nodeNext);
                        }
                    }
                }
            }

        }

        private static List<Node> getRootNodes(List<Node> list)
        {//获取所有的根节点
            List<Node> rootNodes = new List<Node>();

            int length = list.Count;
            for (int i = 0; i < length; i++)
            {
                    if (list[i].isRoot())
                    {
                        rootNodes.Add(list[i]);
                    }
            }
                return rootNodes;
        }

        private static void addNodeToResult(List<Node> result, Node node)//递归添加节点
        {
            result.Add(node);

            if (node.isLeaf())
            {
                return;
            }

            List<Node> list = node.getChildrenList();

            for (int i = 0; i < list.Count; i++)
            {
                addNodeToResult(result, list[i]);
            }
        }
    }

好了,代码就这些了。我用的是C#写的,其他语言实现也是这样的思路,希望对你有帮助。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38167次
    • 积分:713
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:1篇
    • 译文:0篇
    • 评论:22条
    最新评论