树形递归遍历实现多级评论
来源:互联网 发布:手机网络主播招聘 编辑:程序博客网 时间: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
- 树形递归遍历实现多级评论
- Java实现通过递归遍历树形结构
- SSM递归遍历实现树形菜单
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- [MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- 多级树形菜单的实现
- 多级树形菜单的实现
- ListView实现多级树形菜单
- 转发:[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
- Django自定义标签实现多级评论
- java 递归遍历树形结构
- C代码:指定路径删除N天之前的日志
- PAT 1019. General Palindromic Number (20)
- jquery事件委托off与on连用无效的问题
- android studio 常见问题
- 数据结构与算法(2)--数组和typedef的运用
- 树形递归遍历实现多级评论
- OC中私有方法和私有变量
- flink akka
- 二叉树遍历
- flink akka scala
- Android开发 消息推送 Push
- Maven(一)编译、测试、打包、安装
- 第四章 类和对象
- flink akka 应用