树形结构的定位

本文探讨了在树形结构中定位特定节点的方法。针对数据量大小,提出了两种策略:1) 对于数据量小的情况,使用深度优先搜索(DFS)或广度优先搜索(BFS);2) 对于大数据量,通过在节点中添加唯一标识符,并利用数据库存储和查询。还讨论了通过定义equals()和hashCode()方法,利用HashMap进行缓存以提高性能。
摘要由CSDN通过智能技术生成

                                  树形结构的定位

     回顾过去,无论是学校的书本上,还是网上各种算法,关于树的各种算法可谓是白花争鸣,然而,从各种评论的题目就能看出,大部分讨论的都是以数据结构为焦点的讨论,当然少不了二叉树,他的应用不用说的确非常的大,然而,实际应用中,却经常有多节点树的存在,那么又如何定位其中的一个节点呢?

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")--|
                           |          

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值