由如下一个递归表数据结构,UpBranchNo为该节点的父亲节点,如果为1代表该节点为根节点。
注意: 递归表大家都比较熟悉,如果保存在数据库表中的话, 操作起来会比较方便, 但是这里请注意 该结构是通过一个外部程序返回的一个数据集合,不是在数据库中的。 这样的话如何生成树结构才高效呢。
*********************************************
No. BranchNo. Label UpBranchNo.
1 6666 test6 1
2 11 1234567890 6666
3 22 测试2002 6666
4 44 44 6666
5 55 55 6666
6 66 66 6666
7 77 7 6666
8 101 测试2027 11
9 223 测试2027d 11
10 302 chi 6666
11 403 测试2027 6666
12 500 测试202 6666
13 801 测试17 6666
14 802 测试16 6666
15 803 测试15 6666
16 805 0805 6666
17 829 测试132 77
18 830 0830 77
19 831 0831 6666
20 866 测试12 6666
21 995 测试1 6666
22 1110 测试 829
23 1234 xym 829
24 1982 zhouxin 829
25 2001 测试2001 6666
26 2002 测试2002 6666
27 2003 测试2003 1982
28 2004 测试2004 1982
*********************************************
下面是一个实现, 在测试的时候发现数据很多的话, 效率不是很高。
节点实现类: Branch
public class Branch {
private int branchNo;
private String branchName;
private int upBranchNo ;
... getter and setter 函数省略
}
构造树:Tree
public class Tree {
//ds 为包含该数据集合的一个数据集
public Branch normalOrganization(ds) {
List<Branch> branchs = new ArrayList<Branch>(ds.getRows());
while (!ds.end()) {
Branch branch = new Branch();
branch.setBranchName(ds.value("branch_name"));
branch.setBranchNo(ds.value("branch_no"));
branch.setUpBranchNo(ds.value("up_branch_no"));
branchs.add(branch);
ds.next();
}
System.out.println("*********************************************");
// 利用得到的branchs 构造一棵树结构
return buildBranchTree(branchs);
}
private Branch buildBranchTree(List<Branch> branchs) {
Branch topBranch = null;
for (Iterator iterator = branchs.iterator(); iterator.hasNext();) {
Branch branch = (Branch) iterator.next();
if (1 == branch.getUpBranchNo()) {
topBranch = branch;
topBranch.setBranchs(new ArrayList<Branch>());
// branchs.remove(branch); // 删除该数据, 减少下次的查询时间
iterator.remove();
buildTree(topBranch, branchs);
}
break;
}
return topBranch;
}
private void buildTree(Branch parent, List<Branch> branchs) {
for (Iterator iterator = branchs.iterator(); iterator.hasNext();) {
Branch branch = (Branch) iterator.next();
if (branch.getUpBranchNo() == parent.getBranchNo()) {
if (null == parent.getBranchs())
parent.setBranchs(new ArrayList<Branch>());
parent.getBranchs().add(branch);
iterator.remove();
}
}
if (branchs.size() == 0)
return;
if (null != parent.getBranchs()) {
for (Branch branch2 : parent.getBranchs()) {
if (1 == branch2.getBranchType()) {
buildTree(branch2, branchs);
}
}
}
}
}
大家有什么更高效的实现, 欢迎拍砖。
分享到:
- 2007-09-17 18:39
- 浏览 10015
- 评论(5)
- 论坛回复 / 浏览 (5 / 10354)
- 查看更多
相关推荐
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针; b.删除:从符号表中删除给定名字的表项。 (2)设计词法分析器(也可以使用FLEX生成词法分析器) 设计各单词的状态转换图,并为不同...
使用递归分割算法生成迷宫,递归分割法生成的迷宫较为简单,有点像四叉树,直路多且不扭曲。通俗的说,就是把空间用十字分成四个子空间,然后在三面墙上挖洞(为了确保连通),之后对每个子空间继续做这件事直到空间...
图的最小生成树 上机训练题 简单的猫捉老鼠游戏 利用栈来实现单链表的逆序 穷举密码算法 Bresenham高效画线算法 简单的行编辑器 车站管理系统---自动计算费用 加注解的纸条问题新写的程序推敲 约瑟夫环问题 内部排序...
图的最小生成树 利用栈来实现单链表的逆序 Bresenham高效画线算法 约瑟夫环问题 二叉树的集合操作 递归算法的应用 ...
23.1 最小生成树的形成 23.2 Kruskal算法和Prim算法 思考题 本章注记 第24章 单源最短路径 24.1 Bellman?Ford算法 24.2 有向无环图中的单源最短路径问题 24.3 Dijkstra算法 24.4 差分约束和...
动态规划:通过分解问题为子问题并存储子问题的解,减少重复计算,常用于优化递归解法。代码实现时需定义状态变量和状态转移方程。 图论:研究图的结构和性质的分支。代码可能涉及图的表示(邻接矩阵/邻接表)、遍历...
语法分析(递归下降语法分析) 语义分析(生成语法树的同时进行语义分析) 中间代码生成 支持if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt | while-stmt 支持function-def,function-call 使用高效的...
19.2.1 深度优先生成树 310 19.2.2 半必经结点 311 19.2.3 Lengauer-Tarjan算法 312 19.3 使用SSA的优化算法 315 19.3.1 死代码删除 315 19.3.2 简单的常数传播 316 19.3.3 条件常数传播 317 19.3.4 保持必经结点...
图论:最短路径、最小生成树 动态规划:背包问题、最长子序列 数据结构,主要有如下几种: 数组与链表:单 / 双向链表 栈与队列 哈希表 堆:最大堆 / 最小堆 树与图:最近公共祖先、并查集 字符串:前缀树(字典树...
ANTLR也能够自动生成树的遍历器,这样你就可以访问树中的节点,执行自定义的业务逻辑代码。 本书既是ANTLR 4的参考手册,也是解决语言识别问题的指南。你会学到如下知识: 识别语言样例和参考手册中的语法模式,...
+ [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + [路径问题](#路径问题) + [最近公共祖先](#最近公共祖先) + [划分问题](#划分...
分类模块(服务端):递归算法复杂对象排重无限层级树结构设计 商品模块:POJO、BO、VO抽象模型高效分页及动态排序FTP服务对接、富文本上传 购物车模块:商品总价计算复用封装高复用的逻辑方法封装思想解决...
递归网格排序算法(sort-tile-recursive,STR)是一种性能优良的静态变体,其构建效率高效,查询性能较为优良,但是没有很好的兼顾到数据本身的聚集特性。Hilbert曲线具有较好的数据聚集特性,但是存在一定信息的丢失...
2.5.5 最小生成树 2.5.6 应用问题 2.6 数学问题的解题窍门 2.6.1 辗转相除法 2.6.2 有关素数的基础算法 2.6.3 模运算 2.6.4 快速幂运算 2.7 一起来挑战GCJ的题目(1) 2.7.1 Minimum Scalar Product 2.7.2 Crazy ...
可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来...
如果是双项链表的两指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。 线性链表的基本运算:查找、插入、删除。 (2)带链的栈 栈也是线性表,也可以采用链式存储结构。带链的栈可以用来收集计算机...
| 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题...