欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如果根据递归表高效的生成树 数据结构算法UP 

程序员文章站 2024-02-21 19:44:52
...
由如下一个递归表数据结构,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);
				}
			}
		}

	}

}


大家有什么更高效的实现, 欢迎拍砖。