`

快速构建树形结构数据(非递归)

 
阅读更多

 

       通过平铺的原始树形结构数据,快熟构建节点的父子管理,完成树型结构数据的构建,一般在配合前段树形机构显示中有特殊需求的情况中使用。如果需要提出一个父子结构数据中部分数据,如果利用hibernate的级联查询,是很方面获取树形结构的全量,但要剔除部分数据就麻烦了,而且hinernate执行的时候是多个SQL,效率也差一些(不考虑缓存哈)。

 

       原始数据结构:

       ID,PID,NAME....

       目标数据(json):

       {

            id:1

            name:'NAME1',

            children:[

                {id:2,name:'name2',children:[...]}

            ]

       }

 

好了,直接上代码先。

/**
 * 快速构建树结构
 * 
 * 非递归,使用2次循环完成构建。
 * @author zhangpu
 *
 */
public class QuickTreeBuilder {

	public static void main(String[] args) {
		// 构建原始数据:这里为了简便,原始数据集合使用的也是Node对象,
		// 实际情况可以是其他任意entity,只需要在后面构建树时进行转化就OK
		List<Node> orginals = new ArrayList<Node>();
		// parentId = 0 表示顶层,你也可以构建原始数据parentId=null是顶层,由你决定。
		for (int i = 1; i <= 5; i++) {
			orginals.add(new Node(i, i - 1, "name" + i));
		}
		// 构建一个Map,把所有原始数据的ID作为Key,原始数据对象作为VALUE
		Map<Integer, Node> dtoMap = new HashMap<Integer, Node>();
		for (Node node : orginals) {
			// 如果原始数据对象不是Node,这里就可以直接写个conver转化
			// 原始数据对象为Node,放入dtoMap中。
			dtoMap.put(node.getId(), node);
		}

		List<Node> result = new ArrayList<Node>();
		for (Map.Entry<Integer, Node> entry : dtoMap.entrySet()) {
			Node node = entry.getValue();
			if (node.getParentId() == 0) {
				// 如果是顶层节点,直接添加到结果集合中
				result.add(node);
			} else {
				// 如果不是顶层节点,找的起父节点,然后添加到父节点的子节点中
				if (dtoMap.get(node.getParentId()) != null) {
					dtoMap.get(node.getParentId()).addChild(node);
				}
			}
		}

		// 如果有排序需求,可以在最后对输出的结构进行排序
		// 打印结果数据
		System.out.println(result);

	}

	static class Node {
		private int id;
		private int parentId;
		private String name;
		private List<Node> children = new ArrayList<Node>();

		public Node() {
		}

		public Node(int id, int parentId, String name) {
			super();
			this.id = id;
			this.parentId = parentId;
			this.name = name;
		}

		public void addChild(Node node) {
			this.children.add(node);
		}

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public int getParentId() {
			return parentId;
		}

		public void setParentId(int parentId) {
			this.parentId = parentId;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public List<QuickTreeBuilder.Node> getChildren() {
			return children;
		}

		public void setChildren(List<QuickTreeBuilder.Node> children) {
			this.children = children;
		}

		@Override
		public String toString() {
			return "{id:" + id + ", parentId:" + parentId + ", name:" + name + ", children:" + children + "}";
		}

	}

}

    

     

      

分享到:
评论

相关推荐

    用递归实现C#树形结构

    在C#编程中,树形结构是一种常见的数据结构,它模拟了自然界中的树状关系,如文件系统、组织架构或阶层关系等。本篇将详细探讨如何使用递归方法来实现C#中的树形结构。 首先,理解树形结构的基本概念至关重要。在...

    基于JAVA建立树形结构的算法优化.pdf

    在树形结构中,每个节点可能包含多个子节点,因此构建树形结构的算法复杂度通常与数据量的规模密切相关。 一个高效地在内存中构建完整树形结构的算法应该能够减少数据加载次数,避免频繁的数据库查询。将树形结构...

    数据结构二叉树遍历递归,非递归

    二叉树作为一种重要的数据结构,在计算机科学中广泛应用于搜索、排序、树形表示等领域。它由节点(包含数据和两个指向子节点的引用)组成,一个节点可以有零个、一个或两个子节点,分别称为左子节点和右子节点。在本...

    java-根据过滤条件显示树形结构

    树形结构是一种非线性的数据结构,它由节点(或称为顶点)和边组成,每个节点可以有零个或多个子节点。在Java中,我们通常使用`java.util.TreeSet`、`java.util.TreeMap`或自定义类来实现树的逻辑。对于显示树形结构...

    树形结构(增删改查刷新等功能附SQL脚本)

    - 树形结构是由节点(或称为顶点)和边构成的非线性数据结构。每个节点可以有零个或多个子节点,而根节点没有父节点。这种结构允许数据以层次的方式组织,便于理解和操作。 - 在这个项目中,树形结构可能代表某种...

    树形结构算法 PHP方面

    "毗邻目录模式"或"递归模式算法"是一种遍历或构建树形结构的方法,特别是在处理文件系统目录时。在这种模式下,我们从根目录开始,递归地访问每一个子目录,处理每个目录下的文件和子目录。这个过程可以用来复制目录...

    网站常用简单的树形结构

    树形结构是一种非线性的数据结构,它由节点(或称为顶点)和边构成,每个节点可以有零个或多个子节点,而顶层节点通常被称为根节点。在网站后台管理中,这种结构常用于菜单、权限控制、分类管理等领域。 为了实现一...

    菜单树(树数据结构+JSP页面递归调用构建菜单树)

    总结起来,构建菜单树涉及理解树数据结构、递归编程以及JSP的使用。通过将菜单数据结构化,然后在JSP页面上进行递归遍历,我们可以生成动态的菜单树,提供直观的用户界面。在实际开发中,还应考虑性能优化、权限控制...

    java树节点逐级汇总.zip

    在Java编程中,构建树形结构数据是一种常见的需求,特别是在数据组织、文件系统或数据库层次结构的表示中。"java树节点逐级汇总.zip"这个压缩包提供的内容,旨在帮助开发者处理无序列表数据,并将其转化为可以逐级...

    Android 完美树形结构,可实现三态选择

    在Android开发中,构建一个可实现三态选择的完美树形结构是非常常见且重要的需求,尤其是在展示层级关系数据,如组织结构、菜单导航等场景。本文将深入探讨如何实现这样的功能,并结合提供的资源进行分析。 首先,...

    C语言实现二叉树的前序遍历(非递归)

    二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于搜索算法、排序算法以及数据压缩等场景,因其在查找、插入和删除操作上具有较高的效率...

    纯js建类,并构建树形结构,使用简单,操作方便

    接下来,构建树形结构通常是通过递归或迭代方法实现的。假设我们有一个扁平化的数据数组,如下所示: ```javascript const flatData = [ { id: 1, parent: null, name: '根节点' }, { id: 2, parent: 1, name: '...

    树形结构treemunu

    树形结构,通常被称为“树”,在信息技术领域中是一种数据结构,它被广泛应用于各种场景,包括文件系统、数据库索引、计算机科学的算法以及用户界面设计,如创建树形菜单。这种结构模拟了自然界中的树,每个节点代表...

    Android树形结构列表

    树形结构是一种非线性数据结构,由节点(Node)组成,每个节点可以有零个或多个子节点。在Android中,通常用递归的方式来表示和操作树形结构。例如,我们可以创建一个`TreeNode`类,包含数据字段、子节点列表以及...

    非线性数据结构的实现与应用(非递归).pdf

    在本份文档中,我们关注的焦点是树形数据结构的实现,以及其在非递归方式下的应用。树是一种非线性数据结构,它可以用来模拟具有层级关系的数据集,它通常由一系列节点构成,每个节点都有零个或多个子节点,而根节点...

    数据结构中递归转非递归算法分析及模型设计研究.pdf

    递归算法具有思路明确、代码简洁的优点,尤其在处理树形结构和图结构等复杂数据结构时,递归提供了直观且容易理解的解决方案。然而,递归算法在执行过程中需要不断地开辟栈空间来存储每一层递归的状态信息,包括返回...

    无限制树形结构

    树形结构是由节点(或称为元素)和边(连接节点的线)构成的非线性数据结构。每个节点可以有零个或多个子节点,而根节点没有父节点。在无限制的树形结构中,节点的层级和数量理论上没有上限,可以根据需要无限扩展。...

    数据结构课件之递归ppt

    递归在实际应用中非常广泛,比如在树形结构的遍历、分治算法(如快速排序、归并排序)、动态规划等问题中都有所体现。快速排序是递归算法的一个经典例子,通过划分数组并递归处理子数组来实现高效排序。递归版本的...

    带数据库的递归经典树形菜单

    本文将深入探讨“带数据库的递归经典树形菜单”这一主题,结合给定的文件内容,包括如何实现递归,构建树形结构,以及如何通过SQL语句来管理和操作数据。 首先,我们要理解“递归”这一概念。在编程中,递归是一种...

Global site tag (gtag.js) - Google Analytics