在平常的项目中经常使用tree,我们也需要将这些treenode的信息持久化,然而实际的数据库中我们不是将某个node的子节点字段作为父节点的一个字段,当然这也不符合实际情况(父子关系,没有父亲,哪来儿子?)所以我们通常的tree 的一个node对象一般都存parent_id.如图是也treenode 的类图
作为一个简单的存储我们只需要将id,name,parent_id 存储起来。当然存储很简单,利用递归遍历树结构,存储所有的node就OK.
如果你的tree是动态加载,那么不存在什么问题,你只要根据parent_id 进行检索,进而渲染node就可以了,如果ui要一次将所有的node渲染上去,那么我们该如何将这一条条数据构建成一个tree model?
当然本办法还是有的,我们利用递归也能实现代码 如下:
private static Node popularTree(List<Node> nodes,Node p_node) { if(nodes.contains(p_node))nodes.remove(p_node); for(Node node:nodes){ if(node.getParent_id().equals(p_node.getId())){ p_node.getChildren().add(node); popularTree(nodes,node); } } return p_node; }
即使每次都会去掉当前节点,但是如果一个tree稍微大一点那么,这个来做会有很多很多循环,导致构建tree model 非常耗时。
那么我们能否想一种更好的办法? 当然我这里写此博客不是来说明前面的,重点还是后面。
其实我们不需要这递归 循环。 我们将所有的node 以id为key 以 node对象为value存放的一个map中,
然后我们的代码就变得如此简单:
private static Node popularTree(Map<Integer,Node> nodesMap,List<Node> nodesList,Node root){ for(Node node:nodesList){ if(node.getParent_id().equals(root.getId())){ root.getChildren().add(node); }else if(nodesMap.containsKey(node.getParent_id())){ nodesMap.get(node.getParent_id()).getChildren().add(node); } } return root; }
这样的话我们就仅仅遍历了2次,但是具体第一种方法会执行多少个循环我也不知道。
小记:在我们平时的编程中不一定要按照实际的一些想法来组织数据,我们需要从多个角度来思考,这样话我们的代码执行效率也会有所提高。
相关推荐
- `UPM.M`、`BESIDE.M`、`rev.m`:这些可能是用户自定义的函数,分别可能与上采样、并行处理或者反转操作有关。 - `near_sym_b.mat`:这是一个.mat文件,通常存储MATLAB的数据或变量,可能是保存的近似对称小波系数...
在计算机科学中,数据结构是组织、管理和存储数据的方式,而算法则是处理这些数据的步骤。严蔚敏教授的《数据结构》是一本经典教材,它深入浅出地讲解了数据结构与算法的核心概念。在"03 Tri_BinaryTree.zip"这个...
然后,创建一个数据模型来存储整个树结构,这可能是一个数组,其中每个元素都是ContactNode实例。 对于UITableView,我们需要实现UITableViewDataSource协议,其中包括了`numberOfSectionsInTableView`,`tableView...
数据结构是计算机科学中的一门基础学科,旨在研究如何组织、存储和使用数据,以便于高效地进行数据处理和分析。在IT行业中,数据结构是笔试和面试的必备知识,以下是微软、Google等大IT公司的数据结构笔试试题。 一...
### 数据结构与算法题解概览 #### 一、基础知识篇 **1. 基础数据结构** - **字符串(String)** - 字符串是计算机编程中最基本的数据类型之一,用于处理文本数据。 - 实例问题:实现一个函数来判断两个字符串是否...
1. **List**(链表):链表是一种线性数据结构,与数组不同,它的元素在内存中并不连续存储。链表由节点组成,每个节点包含数据和指向下一个节点的引用。主要类型有单链表、双链表和环形链表。常见的操作包括插入、...
二叉树(Binary Tree)是计算机科学中一种重要的数据结构,它是一种非线性的数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树在算法设计、数据存储以及数据检索等方面有着广泛的应用,...
本资源"《C语言数据结构各种程序源代码》"提供了多种经典数据结构的实现,包括String(字符串)、队列、二叉树、赫夫曼树(Huffman Tree)、链队列、十字链表、顺序表和稀疏矩阵。以下是对这些数据结构及其相关程序...
### 微软的数据结构与算法面试题解析 #### 一、链表反转算法实现 **题目描述**: 编写一个函数`List_reverse(List l)`,该函数用于反转单向链表。 **代码分析**: ```plaintext 1. List_reverse(List l) { 2. if...
哈弗曼树的构造过程中可能涉及到优先队列,而优先队列通常可以通过堆数据结构实现,这与排序算法密切相关。 7. **C++ 输入/输出库**: 代码中包含了 `<iostream>` 和 `<cstring>` 头文件,分别用于标准输入/输出和...
此外,还可以使用迭代的方式来实现二叉树的反转,主要利用栈来存储待处理的节点。迭代方法的优点在于避免了递归可能导致的栈溢出问题,但代码相对复杂一些。 在实际应用中,二叉树的反转可以用于解决一些特定问题,...
2. **物理结构**:指数据的存储结构,包括顺序存储、链式存储等。 ### 常见数据结构类型 #### 1. 数组(Array) 数组是一种简单的线性结构,它将一组相同类型的元素按照一定的顺序组织起来,并通过下标来访问这些...
顺序表是一种常见的线性表存储结构,其中的元素在内存中是连续存放的。Seqlist.h 文件定义了一个通用的顺序表模板类 `SeqList`,该类支持多种基本操作: - **构造函数**:创建一个指定大小的顺序表,默认大小为100...
本资源“数据结构1800例题与答案”提供了一套丰富的练习题和解题方案,旨在帮助学习者深入理解和掌握数据结构的各种概念和技术。 在数据结构的学习中,常见的数据结构类型包括数组、链表、栈、队列、树(如二叉树、...
微软的经典数据结构与算法面试题是评估编程能力和逻辑思维的重要工具,尤其对于C语言和嵌入式开发的工程师来说,掌握这些基础知识至关重要。以下将详细解释题目中的几个关键知识点: 1. 反转链表: - **循环算法**...
4. **KdTree.cpp**:Kd树是一种在高维空间中进行数据存储和检索的数据结构,特别适用于空间分割和最近邻搜索。在计算机图形学、机器学习等领域应用广泛。 5. **TestSlowDisjSets.cpp**:Disjoint Sets(并查集)是...
B*Tree索引通过分支块和叶块构建树状结构,其中叶块存储索引列的值和对应的rowid,而分支块则用于导航。这种结构允许数据库快速定位到所需的数据行。对于范围查询,B*Tree索引能够避免从根节点开始的重复定位,只需...
Oracle数据库中的索引是提升查询效率的关键工具,它通过预排序和存储数据的特殊结构,使得数据检索更快。本文将详细解析Oracle中的几种主要索引类型:B*Tree索引、反向索引、降序索引以及位图索引。 1. **B*Tree...
- **分层结构:**B*Tree索引采用层次化的存储结构,包括根节点、中间节点和叶节点。 - **叶节点:**存储具体的键值对(key-value pair),其中键是索引列的值,而值则是指向对应数据行的行标识符(RID)。 - **中间节点...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。C语言作为底层编程语言,是实现这些数据结构和算法的常用工具。本资源“数据结构算法设计笔试面试题100题内含C语言解析”是针对求职者或学习者...