【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 ...
随机推荐
- 《Java中的不可变类》
//不可变类举例: /* 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量, 且这个引用类是可变类,所以导致Person类也变成了可变类. */ class ...
- mysql表分区(摘自 MySQL表的四种分区类型)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- HDU 1811 并查集
题意: 思路:topo+并查集 #include <cstdio> #include <vector> #include <algorithm> #include ...
- js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!
appendChild().insertBefore()是移动element节点,看书的时候注意过,也可以做一个简单的例子测试一下: <div id="div1"> & ...
- C++中 destory() 和deallocate()以及delete函数的相关性和区别性
这里非常的绕口 需要仔细的来看看: destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备 deallocate():真正的释放一个内存 ...
- oracle 常用语法
一.ORACLE的启动和关闭1.在单机环境下要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下su - oraclea.启动ORACLE系统oracle>svrmgrlSVRMG ...
- Linux 安装 node
在 Linux 上安装 node,使用 Linux 编译后的版本最佳. 1.进入 node 官网,找到 Linux 版本下载,这里我们右键复制下载地址即可. 2.在 Linux 上,使用命令 curl ...
- 支持向量机(SVM)基础
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- Sea.js学习4——Sea.js的配置
可以对 Sea.js 进行配置,让模块编写.开发调试更方便. seajs.config seajs.config(options) 用来进行配置的方法. seajs.config({ // 别名配置 ...
- cl.exe命令方式编译cpp
直接在命令行窗口调用cl编译cpp文件 往往不能通过. 主要原因是一些头文件及可执行文件未在环境变量中设置.可以通过执行VSVAR32.BAT批处理文件来设置环境变量,注意vs2005跟2008的放置 ...