【Tree 2】树形结构数据呈现的非递归算法(循环)实现
一、基本概况
上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理。首先,改造数据库表设计,加入度的概念:
首先,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文档的目录实现。
在用非递归实现了这个树的打印之后,我突然就明白了之前有一个姑娘问我的问题:她说为什么每次左侧边的菜单栏加载的时候,都要从上往下加载,而不是一次性加载完。今天跟了每一步代码之后发现,因为使用递归的时候,就是先把每一个结点的孩子结点全部遍历结束后,才会开始加载下一个结点。而使用非递归则不一样,因为它是一次性直接加载完所有的数据,所以是一次性加载完毕。
四、总结
对于平时的学习,还是多总结总结吧。我感觉,递归不递归的,其实也不那么重要,根据自己的实际情况进行取舍。
循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销。
递归和循环之间的选择。一般情况下, 当循环方法比较容易找到时, 你应该避免使用递归。
【Tree 2】树形结构数据呈现的非递归算法(循环)实现的更多相关文章
- 【java基础 4】树形结构数据呈现的非递归算法(循环)实现
一.基本概况 上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理.首先,改造数据库表设计,加入度的概念: 首先,layer的 ...
- 【Tree 1】树形结构数据呈现的递归算法实现
一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...
- 【java基础 3】树形结构数据呈现的递归算法实现
一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...
- 【Tree 3】树形结构数据加载的思考
前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...
- 树形结构数据存储方案的选择和java list转tree
树形结构数据存储方案 Adjacency List:每一条记录存parent_idPath Enumerations:每一条记录存整个tree path经过的node枚举Nested Sets:每一条 ...
- 构建树形结构数据(全部构建,查找构建)C#版
摘要: 最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件. 一.遇到的问题 获取全部任务拼接树形速度过慢(数据量大约在900条左右)且查询速度 ...
- 【java基础 5】树形结构数据加载的思考
前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...
- js将有父子关系的数据转换成树形结构数据
js将有父子关系的数据转换成树形结构数据 比如如下基本数据: let allDatas = [ { id: 3, name: 'bbbb', parendId: 1 }, { id: 2, name: ...
- Asp.Net Mvc自定义控件之树形结构数据生成表格 - WPF特工队内部资料
最近项目中有一个需求,将树形结构的数据,以表格的形式展示在页面中,下图是最终呈现效果: 源码: @{ Layout = null; } <!DOCTYPE html> <html&g ...
随机推荐
- 团队开发——冲刺1.d
冲刺阶段一(第四天) 1.昨天做了什么? 完成部分界面设置,补充三层难度界面.游戏结束界面. 2.今天准备做什么? 优化界面细节.查看C#资料,再解决自己电脑的问题. 3.遇到什么困难? 已经固定好的 ...
- 史上最全的html标签属性用法对照表
html标签特效代码语法使用对照说明 <!> 跑马灯 <marquee>...</marquee>普通卷动 <marquee behavior=slide&g ...
- magento中如何实现产品图片放大效果
Magento列表页用jQuery实现产品图片放大效果今天看到个网站,鼠标移到列表页的产品图片上,旁边会弹出一个大图,感觉不错,就自己在Magento里写了个.先看看效果 这个效果比较好实现,打开li ...
- springboot系列之-log
配置文件以application.yml为例说明: Spring Boot默认的日志组件为Logback. 一. 日志配置参数: logging: file: #日志文件,绝对路径或相对路径 path ...
- 有一个无效 SelectedValue,因为它不在项目列表中。
在项目中出现绑定下拉框报错的问题 1:可能是先赋值,再绑定数据的问题 检查代码,是否有在数据绑定钱进行了赋值.
- mysql 把文件中的sql语句导入到mysql中
mysql -uroot -proot -Dcollege</home/wwwroot/default/data/xlxxb_2014-10-16.txt;
- 基于Python的接口测试框架
分析 接口是基于HTTP协议的,那么说白了,就是发起HTTP请求就行了,对于Python来说比较简单.直接使用requests就可以很轻松的完成任务. 架构 整个框架是比较小的,涉及的东西也比较少,只 ...
- 【redis】 redis 创建集群时,Waiting for the cluster to join.... 一直等待
redis 搭建集群时,一直join.... ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1: ...
- MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码
MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查 ...
- [uboot]E9-i.MX6Q-uboot移植
参照:http://blog.csdn.net/girlkoo/article/details/45420977 文档参照: <i.MX BSP Porting Guide-2015/12, ...