`
icess
  • 浏览: 248499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如果根据递归表高效的生成树

阅读更多
由如下一个递归表数据结构,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);
				}
			}
		}

	}

}


大家有什么更高效的实现, 欢迎拍砖。
分享到:
评论
5 楼 ray_linn 2007-09-21  
可以在id上下功夫


10--->root 1
1001-->子类1
1002--->子类2
10010001--->子类1的商品A
10010002---->子类1的商品B


4 楼 rinapt 2007-09-21  
是啊一般都会用map
3 楼 baallee 2007-09-20  
这种问题我比较喜欢用map,首先map本身就是个树型结构,可以用他的实现类treeMap.还能帮你排续。而且map可以帮你高效的完成查找和插入的操作。
2 楼 icess 2007-09-19  
第二步 好像一次遍历也完不成吧。
1 楼 Zmud 2007-09-18  
大体思路没问题,感觉效率上有点……遍历的次数过多。

我觉得大概的算法可以是:
1、new所有的节点,并以No为key加入到一个Map中;
2、遍历Map,每个节点根据UpNo找自己的爹,没爹的就是根节点;
3、返回Tree;

相关推荐

    数据结构与常见算法,从递归开始,排序,至链表,队列,栈,树,图等。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    学习数据结构和算法分析的一些实例,包括排序算法、搜索算法、递归、二叉树等等实例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    cifafenxi.rar_bison 中间代码_c-语法图_语法树 bison_转换器的预测_预测转换器

    如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针; b.删除:从符号表中删除给定名字的表项。 (2)设计词法分析器(也可以使用FLEX生成词法分析器) 设计各单词的状态转换图,并为不同...

    迷宫算法Java程序设计.zip

    使用递归分割算法生成迷宫,递归分割法生成的迷宫较为简单,有点像四叉树,直路多且不扭曲。通俗的说,就是把空间用十字分成四个子空间,然后在三面墙上挖洞(为了确保连通),之后对每个子空间继续做这件事直到空间...

    C语言经典算法

    图的最小生成树 上机训练题 简单的猫捉老鼠游戏 利用栈来实现单链表的逆序 穷举密码算法 Bresenham高效画线算法 简单的行编辑器 车站管理系统---自动计算费用 加注解的纸条问题新写的程序推敲 约瑟夫环问题 内部排序...

    C语言经典算法——数据结构

    图的最小生成树 利用栈来实现单链表的逆序 Bresenham高效画线算法 约瑟夫环问题 二叉树的集合操作 递归算法的应用 ...

    算法导论中文版

     23.1 最小生成树的形成  23.2 Kruskal算法和Prim算法  思考题  本章注记 第24章 单源最短路径  24.1 Bellman?Ford算法  24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和...

    ACM模板和一些题目的代码实现

    动态规划:通过分解问题为子问题并存储子问题的解,减少重复计算,常用于优化递归解法。代码实现时需定义状态变量和状态转移方程。 图论:研究图的结构和性质的分支。代码可能涉及图的表示(邻接矩阵/邻接表)、遍历...

    实现TINY+语言的词法分析程序(扫描程序)【100012145】

    语法分析(递归下降语法分析) 语义分析(生成语法树的同时进行语义分析) 中间代码生成 支持if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt | while-stmt 支持function-def,function-call 使用高效的...

    美国..现代编译原理C语言描述.高清版

    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 保持必经结点...

    leetcode答案-leetcode:记录自己的算法成长

    图论:最短路径、最小生成树 动态规划:背包问题、最长子序列 数据结构,主要有如下几种: 数组与链表:单 / 双向链表 栈与队列 哈希表 堆:最大堆 / 最小堆 树与图:最近公共祖先、并查集 字符串:前缀树(字典树...

    antlr4权威指南

    ANTLR也能够自动生成树的遍历器,这样你就可以访问树中的节点,执行自定义的业务逻辑代码。  本书既是ANTLR 4的参考手册,也是解决语言识别问题的指南。你会学到如下知识:  识别语言样例和参考手册中的语法模式,...

    IOI国家集训队论文集1999-2019

    + [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + [路径问题](#路径问题) + [最近公共祖先](#最近公共祖先) + [划分问题](#划分...

    毕业设计-ssm构建彩虹猫购物商城.zip

     分类模块(服务端):递归算法复杂对象排重无限层级树结构设计  商品模块:POJO、BO、VO抽象模型高效分页及动态排序FTP服务对接、富文本上传  购物车模块:商品总价计算复用封装高复用的逻辑方法封装思想解决...

    基于Hilbert曲线的STR索引改进算法 (2014年)

    递归网格排序算法(sort-tile-recursive,STR)是一种性能优良的静态变体,其构建效率高效,查询性能较为优良,但是没有很好的兼顾到数据本身的聚集特性。Hilbert曲线具有较好的数据聚集特性,但是存在一定信息的丢失...

    挑战程序设计竞赛(第2版)

    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 | 稳定婚姻问题...

Global site tag (gtag.js) - Google Analytics