树形结构的定位
回顾过去,无论是学校的书本上,还是网上各种算法,关于树的各种算法可谓是白花争鸣,然而,从各种评论的题目就能看出,大部分讨论的都是以数据结构为焦点的讨论,当然少不了二叉树,他的应用不用说的确非常的大,然而,实际应用中,却经常有多节点树的存在,那么又如何定位其中的一个节点呢?
1、要分析树,定位节点,主要就是树的查找 。
由于这个树没有什么限制,因此这二叉树的遍历、二分查找法等方法查找在这里不再适用(这里就不介绍了)。
这里,如果树的高度和分支比较小,我们这里可以用2种笨重图遍历:
DFS(深度优先,堆栈结构实现),BFS(广度优先,对列结构实现);
上面这种限制要求:
一切查找都要从节点定义开始:
public class Node {
private String dataStr;
//TODO get / set method .
public Node(String str){
dataStr = str;
}
}
假设,我在程序(或数据库)中限制,每个dataStr(节点数据最大值为1024 byte),因为上述2种方式的遍历中,
都需要用的递归算法,因此,在定位到需要的数据前,需要将数据存在栈中,因此,当树的高度和分支节点数增加时,
栈内存将被几何方式耗尽,因此上述方法仅适用于数据量小时;
2、对于数据量大时的一个可行方法(其实,只要是一种好方法都很难,这里简单介绍下我认为可行的方法)
一切的查找/定位 都要从定义节点开始;这里我先说明一下我的思路。
1、在定义节点时,在节点结构中增加相应的标示位字段 (String node_label);
如果环境不允许增加字段可以通过在dataStr上作标示位,比如 (dataStr + 分隔符 + node_label )
2、在插入每个节点时,除了要将相应的用户数据dataStr保存进数据库,同时要产生一个系统唯一的一个
标示符 :产生系统唯一的字符串方式有很多,比如引用Calendar的当前时间毫秒数,就是唯一的,
但这里的要求不仅要唯一,而且他的主要任务是方便树节点的定位。
/**
* 这个方法,主要是在数据库中专门维护一个表,其中2个字段
* code:是我们要使用的标志,
* type:这个可以用户扩展,比如dataStr分类时他可以被用上
*
**/
public synchronized String getValue(String parent_node_label) {
//比如parent_node_label = "-11" ; 则label = "-11-111", (G节点的标志位,C下最大的)
String label = getMaxLabel(parent_node_label);
//转换处理label:"-11-111" 处理后变为 "-11-1111",并保存到数据库中
insert(convert_method(label));
return label;
}
//TODO updat_method 更新
//TODO delete_method(boolean flag) 级联删除
举一个树形结构的例子:(其中 &^& 代表分隔符)
|-----B(dataStr = "B&^&-1")
| |-------E(dataStr = "E&^&-11-1")
A(根节点)--|-----C(dataStr = "C&^&-11")--|
|