【java基础 4】树形结构数据呈现的非递归算法(循环)实现
来源:互联网 发布:程序员 硬件 编辑:程序博客网 时间:2024/06/05 19:20
一、基本概况
上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理。首先,改造数据库表设计,加入度的概念:
首先,layer的设计,是来源于Word文档的目录带来的灵感。想一想我自己在写Word文档的时候,通过标题1,标题2等的设立,然后就可能自动生成目录。我感觉这个和我要完成的树结构数据的处理有共同之处。当然,在这里的010000,是我自己对于树的度的表示,主要是用于排序,而后面的depth,则是对于我自己方便在Java控制台打印额外添加的一个字段(实际应用,不需要)
然后是实体类设计:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private String id;private String name;private String pid;private String layer;private String depth;</span>
建立实体类的get和set方法
二、代码实现
1,查询所有的数据
<span style="font-family:KaiTi_GB2312;font-size:18px;">public List<TreeEntity> findAllData() {<span style="color:#ff0000;">String sql = "select * from test where id is not null order by layer ASC";</span>List<TreeEntity> treeList = null;try {conn = DbUtil.getConnection();pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();treeList = new ArrayList<TreeEntity>();while (rs.next()) {TreeEntity myTree = new TreeEntity();myTree.setId(rs.getString("id"));myTree.setName(rs.getString("name"));myTree.setPid(rs.getString("pid"));myTree.setDepth(rs.getString("depth"));treeList.add(myTree);}} catch (SQLException e) {e.printStackTrace();} finally {DbUtil.close(pstmt);DbUtil.close(conn);}return treeList;}</span>
事实上,执行了这个方法之后,数据库的数据,就已经是按照菜单形式排列整齐的数据了。那么,怎么显示的更为美观呢?
2,显示树
<span style="font-family:KaiTi_GB2312;font-size:18px;">public void displayTree(){List<TreeEntity> List=this.findAllData();String prefix="";for(int i=0; i<List.size(); i++){if("1".equals(List.get(i).getDepth())){prefix="|-";}if("2".equals(List.get(i).getDepth())){prefix="|----";}if("3".equals(List.get(i).getDepth())){prefix="|--------";}System.out.println(prefix+List.get(i).getName());}}</span>
首先,这里有几个if语句,是我借助depth字段的值,来进行数据打印的一个过程。一般来说,作为一个系统的左侧边菜单,度的最大值,应该是在5个左右,少的话,直接在这里写。多的话,则有工厂方法模式可以简单改造。(而且,这一点只是我要在控制台打印出一棵树,自己额外加上的)
在实际应用中,比如说JQuery的ZTree插件,则有专门对应的简单Array形式的数据加载,如下:
第一种格式加载:标准的带有父子关系的ZTree加载
var zTreeNodes = [ {"id":1, "name":"test1", "nodes":[ {"id":11, "name":"test11", "nodes":[ {"id":111, "name":"test111"} ]}, {"id":12, "name":"test12"} ]}, ...... ];
第二种格式加载:带有父子关系的简单Array格式加载
var treeNodes = [ {"id":1, "pId":0, "name":"test1"}, {"id":11, "pId":1, "name":"test11"}, {"id":12, "pId":1, "name":"test12"}, {"id":111, "pId":11, "name":"test111"}, ...... ];
在实际应用的时候,完全可以采用第二种数据加载方式,让程序变得更为简单!
3,主程序代码及结果
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void main(String[] args) {TreeDepth tree = new TreeDepth();tree.displayTree();}</span>
三、代码思考
可以看出的是,改造数据库设计之后,只用了1次循环,就实现了最终的效果,而没有用递归。那么问题的关键点有:每次插入数据的时候,layer的值填充问题,那么这个其实是有规律的,每个人都可能会有一套自己的填充规律,就比如说我的灵感则来自于Word文档的目录实现。
在用非递归实现了这个树的打印之后,我突然就明白了之前有一个姑娘问我的问题:她说为什么每次左侧边的菜单栏加载的时候,都要从上往下加载,而不是一次性加载完。今天跟了每一步代码之后发现,因为使用递归的时候,就是先把每一个结点的孩子结点全部遍历结束后,才会开始加载下一个结点。而使用非递归则不一样,因为它是一次性直接加载完所有的数据,所以是一次性加载完毕。
四、总结
对于平时的学习,还是多总结总结吧。我感觉,递归不递归的,其实也不那么重要,根据自己的实际情况进行取舍。
循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销。
递归和循环之间的选择。一般情况下, 当循环方法比较容易找到时, 你应该避免使用递归。
- 【java基础 4】树形结构数据呈现的非递归算法(循环)实现
- 【java基础 3】树形结构数据呈现的递归算法实现
- 树形结构非递归算法
- Java基础--递归算法(递归结构)
- 将树形结构的数据转换为二维数组 (续 PHP非递归方式实现无限分类(转载))
- Java实现树结构数据的递归与非递归遍历
- 用递归算法得到Java的树形结构
- php实现数据树形结构 递归方法
- Java递归算法构造JSON树形结构
- Java递归实现删除树形结构的任一节点
- start with connect by prior 实现递归查询(查询数据的树形结构关系)
- Java实现通过递归遍历树形结构
- 树形结构递归实现
- java、js中实现无限层级的树形结构(类似递归)
- 递归删除树形结构的所有子节点(java和mysql实现)
- Java、JS中实现无限层级的树形结构(类似递归)
- 【java基础 5】树形结构数据加载的思考
- 【LintCode-66】二叉树的前序遍历(Java实现-递归算法/非递归算法)
- 机房收费系统总结
- polyglot库介绍
- 原生的ajax 异步交互过程
- C语言控制Linux终端的颜色输出
- Selenium2Library 打开IE浏览器失败
- 【java基础 4】树形结构数据呈现的非递归算法(循环)实现
- 常见布局方式
- java笔记--day09--接口(三)抽象类和接口的区别
- 使用Navicat for MySQL只导出MySQL数据库的表结构-图文教程
- 机房收费之上下机
- hdu 4283 You Are the One (区间dp)
- POJ 3461
- 知识点小结
- 【华为OJ】四则运算