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

来源:互联网 发布:手机网络主播招聘 编辑:程序博客网 时间:2024/05/17 21:59

最近参加了学校的网页设计大赛,做了一个论坛网站,期间后台的多级评论用了我很多时间,什么是多级评论呢,也就是针对某一条评论,其他用户都可以在该评论基础上回复对方,这样也就形成了一条树形结构,我用了递归来实现树的遍历,感觉这个算法很有用,在许多方面都有可能用到,比如说像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
原创粉丝点击