-
2021-02-28 14:25:55
package testng;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
public class Test {
/**
* 添加节点
* @param nodeMap
* @param parentNodeName 父节点名称
* @param nodeName
*/
public static void addNode(Map nodeMap,String parentNodeName,String nodeName){
Node parentNode = null != parentNodeName ? nodeMap.get(parentNodeName) : null;
Node node = nodeMap.get(nodeName);
if(null != node){
return;
}
node = new Node();
node.setName(nodeName);
nodeMap.put(nodeName, node);
if(null != parentNode){
parentNode.addChild(node);
node.setParent(parentNode);
}
}
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
String [] arrays = new String[]{
"测试/测试1/测试2",
"工单/问题反馈309",
"工单/问题反馈565",
"工单/问题反馈54",
"工单/问题反馈310",
"测试专用/123456/test/123"
};
Map resultMap = new HashMap();
for(String line : arrays){
String nodeNameArray [] = line.split("/");
String preNodeName = null;
for(String curNodeName : nodeNameArray){
addNode(resultMap,preNodeName,curNodeName);
preNodeName = curNodeName;
}
}
for(Map.Entry entry : resultMap.entrySet()){
Node node = entry.getValue();
if(null == node.getParent()){
print(node,"");
}
}
}
/**
* 递归打印node
* @param node
* @param blank
*/
public static void print(Node node,String blank){
System.out.println(blank + node.getName());
if(node.getChilds() == null || node.getChilds().isEmpty()){
return;
}
for(Node cur : node.getChilds()){
print(cur,blank + " ");
}
}
static class Node{
private String name;
private int index;
private List childs;
private Node parent;
public List getChilds() {
return childs;
}
public void addChild(Node child) {
if(null == childs){
childs = new ArrayList();
}
childs.add(child);
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
}
打印结果:
测试
测试1
测试2
测试专用
123456
test
123
工单
问题反馈309
问题反馈565
问题反馈54
问题反馈310
更多相关内容 -
java数据结构排序算法之树形选择排序详解
2020-08-30 09:34:44主要介绍了java数据结构排序算法之树形选择排序,结合具体实例形式分析了java树形选择排序的原理、实现技巧与相关注意事项,需要的朋友可以参考下 -
java数据结构树
2012-02-02 17:21:39学习JAVA数据结构最好的教程。让你一次学会,终生受用 -
java版数据结构-树结构
2018-07-16 10:33:06java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构; -
Java数据封装树形结构代码实例
2020-08-25 04:01:53主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java数据结构之链表、栈、队列、树的实现方法示例
2020-08-26 06:23:47主要介绍了Java数据结构之链表、栈、队列、树的实现方法,结合实例形式分析了Java数据结构中链表、栈、队列、树的功能、定义及使用方法,需要的朋友可以参考下 -
JAVA如何转换树结构数据代码实例
2020-08-19 10:24:42主要介绍了JAVA如何转换树结构数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java实现简单树结构
2020-08-31 16:31:31主要为大家详细介绍了Java实现简单树结构的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java数据结构之树基本概念解析及代码示例
2020-08-28 19:12:02主要介绍了java数据结构之树基本概念解析及代码示例,介绍了树的定义,基本术语,主要操作及实现等相关内容,具有一定参考价值,需要的朋友可了解下。 -
java中的数据结构——树
2018-10-22 19:05:49树形结构是一种层级式的数据结构,由节点和连接它们的边组成, java语言编写的程序中常常用引用来表示边。根是树中顶端的节 点:它没有父节点。节点表示保存在树中的数据对象。非平衡树是 指根左边的后代比右边多,...树
树形结构是一种层级式的数据结构,由节点和连接它们的边组成, java语言编写的程序中常常用引用来表示边。根是树中顶端的节 点:它没有父节点。节点表示保存在树中的数据对象。非平衡树是 指根左边的后代比右边多,或者相反。 区分树和图的主要特征是树中不存在环路。
树的节点 Root,parent,child,leaf,sibling 。
树的主要类型 N元树 平衡树 二叉树 二叉搜索树 AVL树 红黑树 2-3树(多叉树比二叉树有更多的关键字和子节点)。
树通常结合了有序数组和链表两种数据结构的优点,在树中查找数 据项的速度和在有序数组中查找一样快,并且插入数据项和删除数 据项的速度也和链表一样。 其中,二叉树和二叉搜索树是常用的树。二叉树指树中每个节点 多只能有两个子节点,二叉搜索树指一个节点的左子节点的关键 字值小于这个节点,右子节点的关键字的值大于或等于这个父节 点。 查找节点需要比较要找的关键字值和节点的关键字值,插入需要找 到要插入新节点的位置并改变他父节点的子字段来指向它。如果一 个节点没有子节点,删除它只要把它的父节点的子字段置为null即 可,如果一个节点有一个子节点,把它父节点的子字段置为它的子 节点就可以删除它,如果一个节点有两个子节点,删除它要用他的 后继(该节点的右子节点为根的子树中关键值小的那个节点)来 代替他。可以用数组表示树,不过基于引用的方法更常用。二叉树的效率:
树的大部分操作都需要从上到下一层一层的查找某个节点,因此常 见树的操作(查找,插入,删除)时间复杂度大约是O(logN),如 果树不满,分析起来很困难,不过,可以认为对给定层数的树,不 满的树的平均查找时间比满树要短,因为在它的较低的层上完成查 找的次数要比满树时少。 树对所有常用的数据存储操作都有很高的效率,遍历不如其他操作 快,但是,遍历在大型数据库中不是常用的操作。
B树是多叉树,每个节点可以有几十或上百个关键字和节点,B树中 子节点的个数总是比关键字的个数多1,为达到好的性能,B树通 常在一个节点中保存一块的数据。实战
在控制台上输入一组数据,按照输入数据的格式来构造一棵二叉树,并打印出二叉树的高度。
输入的数据格式如下:
12
2 3
2 11
3 4
3 5
11 12
11 13
4 6
5 7
12 14
12 15
14 16
16 17
用二叉树表示如下:
Java代码实现如下:
输出结果为:
红黑树
普通的二叉搜索树可以快速的找到一个给定关键字的数据项,可以快速的插入和删除数据,如果二叉搜索树中插入的是随机数据,执行效果很好,但是如果插入的是有序的数据或逆序的数据,速度就会变得特别慢,因为插入的数值有序时,二叉树就是非平衡的了,而对于非平衡树,它的快速查找,插入,删除,指定数据项的能力就丧失了。红黑树是增加了某些特点(在红黑平衡的方法中,每个节点都有一个新的特征:它的颜色不是红的就是黑的)的二叉搜索树,它将解决这个问题。
效率:
在红黑树中的查找时间和在普通二叉树中的查找时间几乎完全一样,因为在查找的过程中并没有应用红黑树的特征,额外的开销只是每一个节点的存储空间都稍微增加了一点来存储红黑的颜色(一个boolean变量)。插入和删除的时间要增加一个常数因子,因为不得不在下行的路径上和插入点执行颜色变换和旋转。平均起来,一次插入大约需要一次旋转,但是比在普通的二叉搜索树中要慢。因为在大多数应用中,查找的次数比插入和删除的次数多,所以应用红黑树取代普通的二叉搜索树总体上不会增加太多的时间开销,红黑树的优点是对有些数据的操作不会慢到O(N)的时间复杂度。
总结:保持普通二叉树的平衡是非常重要的,这样可以使找到给定节点必需的时间尽可能短,在二叉树中加入红黑平衡对平均执行效率只有很小的负面影响,却避免了对有序的数据操作的最坏的性能。 -
java数据结构 树与二叉树
2011-06-09 14:06:36详细介绍java里树的概念及实现 及树的java实现和应用 -
java组装树形结构demo.7z
2020-05-14 09:10:54java组装树形结构数据小技巧,巧妙利用java的对象引用特点,仅使用2层for循环即可组装深层树形结构数据;比传统的自循环组装树形数据,效率更高更实用; -
【数据结构】Java 数据结构目录
2021-01-03 20:45:06Java 数据结构目录 整理一下。。。 【动态扩容数组】动态扩容数组 ArrayList实现源码(Java、C++) 【链表List】单向链表 SingleLinkedList、双向链表 LinkedList 实现源码 【循环链表CircleList】单向循环链表、... -
Java数据结构之红黑树的真正理解
2020-08-28 23:31:41主要为大家详细介绍了Java数据结构之红黑树的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java复制树结构数据方法
2016-01-30 09:35:03自己写的一个 用java代码复制树形结构数据的方法 很实用 希望对有需求的朋友给予帮助 -
JAVA 根据数据库表内容生产树结构JSON数据的实例代码
2020-10-20 16:42:54主要介绍了JAVA 根据数据库表内容生产树结构JSON数据的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下 -
Java数据结构与算法之树(动力节点java学院整理)
2020-08-30 21:02:56主要介绍了Java数据结构与算法之树的相关知识,最主要的是二叉树中的二叉搜索树,需要的朋友可以参考下 -
Java 将有父子关系的数据转换成树形结构数据
2021-01-07 07:52:24一、数据库父子结构数据设计 大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL ... -
重温数据结构:树 及 Java 实现
2016-11-17 02:01:54读完本文你将了解到: 什么是树 树的相关术语 根节点、父亲节点、孩子节点、叶子节点如上所述。 节点的度 树的度 ...树的高度 树的深度 ...树的两种实现 ...今天我们来学习下数据结构中的 树。 什么是...读完本文你将了解到:
数据结构,指的是数据的存储形式,常见的有线性结构(数组、链表,队列、栈),还有非线性结构(树、图等)。
今天我们来学习下数据结构中的 树。
什么是树
线性结构中,一个节点至多只有一个头节点,至多只有一个尾节点,彼此连接起来是一条完整的线。
比如链表和数组:
而树,非线性结构的典型例子,不再是一对一,而变成了一对多(而图则可以是 多对多),如下图所示:
可以看到:
- 图中的结构就像一棵倒过来的树,最顶部的节点就是“根节点 (root 节点)”
- 每棵树至多只有一个根节点
- 根节点生出多个孩子节点,每个孩子节点只有一个父节点,每个孩子节点又生出多个孩子
- 父亲节点 (parent) 和孩子节点 (child) 是相对的
- 没有孩子节点的节点成为叶子节点 (leaf)
树的相关术语
根节点、父亲节点、孩子节点、叶子节点如上所述。
节点的度
一个节点直接含有的子树个数,叫做节点的度。比如上图中的 3 的度是 2,10 的度是 1。
树的度
一棵树中 最大节点的度,即哪个节点的子节点最多,它的度就是 树的度。上图中树的度为 2 。
节点的层次
从根节点开始算起,根节点算第一层,往后底层。比如上图中,3 的层次是 2,4 的层次是 4。
树的高度
树的高度是从叶子节点开始,自底向上增加。
树的深度
与高度相反,树的深度从根节点开始,自顶向下增加。
整个树的高度、深度是一样的,但是中间节点的高度 和 深度是不同的,比如上图中的 6 ,高度是 2 ,深度是 3。
树的两种实现
从上述概念可以得知,树是一个递归的概念,从根节点开始,每个节点至多只有一个父节点,有多个子节点,每个子节点又是一棵树,以此递归。
树有两种实现方式:
- 数组
- 链表
数组表示:
我们可以利用每个节点至多只有一个父节点这个特点,使用 父节点表示法 来实现一个节点:
public class TreeNode { private Object mData; //存储的数据 private int mParent; //父亲节点的下标 public TreeNode(Object data, int parent) { mData = data; mParent = parent; } public Object getData() { return mData; } public void setData(Object data) { mData = data; } public int getParent() { return mParent; } public void setParent(int parent) { mParent = parent; } }
上述代码中,使用 角标 来指明父亲节点的位置,使用这个节点组成的数组就可以表示一棵树。
public static void main(String[] args){ TreeNode[] arrayTree = new TreeNode[10]; }
用数组实现的树表示下面的树,(其中一种 )结果就是这样的:
数组实现的树节点使用角标表示父亲的索引,下面用链表表示一个节点和一棵树:
链表表示的节点:
public class LinkedTreeNode { private Object mData; //存储的数据 private LinkedTreeNode mParent; //父亲节点的下标 private List<LinkedTreeNode> mChildNodeList; //孩子节点的引用 public LinkedTreeNode(Object data, LinkedTreeNode parent) { mData = data; mParent = parent; } public Object getData() { return mData; } public void setData(Object data) { mData = data; } public Object getParent() { return mParent; } public void setParent(LinkedTreeNode parent) { mParent = parent; } public List<LinkedTreeNode> getChild() { return mChildNodeList; } public void setChild(List<LinkedTreeNode> childList) { mChildNodeList = childList; } }
使用引用,而不是索引表示父亲与孩子节点。
使用一个 List, 元素是 LinkedTreeNode,就可以表示一棵链表树:
public static void main(String[] args){ LinkedList<LinkedTreeNode> linkedTree = new LinkedList<>(); }
这样只需知道 根节点就可以遍历整个树。知道某个节点也可以获取它的父亲和孩子。
树的几种常见分类及使用场景
树,为了更好的查找性能而生。
常见的树有以下几种分类:
- 二叉树
- 平衡二叉树
- B 树
- B+ 树
- 哈夫曼树
- 堆
- 红黑树
接下来陆续介绍完回来补使用场景。
-
数据结构—树(Tree)的入门原理以及Java实现案例
2020-04-23 17:26:35详细介绍了树这种数据结构的基本概念,以及通用的树的Java实现方式,为后面各种树的深入学习打好基础。本文将详细介绍树这种数据结构的基本概念,以及通用的树的Java实现方式,为后面各种树的深入学习打好基础。
树结构和线性结构的最大的不同是,树中的节点具有明显的层级关系,并且一个节点可以对应多个节点。
1 树的概述
1.1 定义
树结构和线性结构的最大的不同是,树中的节点具有明显的层级关系,并且一个节点可以对应多个节点。树的定义如下:
树(Tree)是n(n≥0)个节点的有限集。n=0时称为空树。在任意一棵非空树中:
- 有且仅有一个特定的称为根(Root)的节点r;
- 当n>1时,其余节点可分为m(m>0)个互不相交的不为空的有限集T1、T2、……、Tm,其中每一个集本身又是一棵树,并且称为根的子树(SubTree)。
从上面树的定义可以看出使用了递归的思想,也就是在树的定义之中还用到了树的概念,根的子树节点,同时作为子树的根节点。递归思想和栈数据结构有关,可以看这篇文章:数据结构—栈(Stack)的原理以及Java实现以及后缀表达式的运算。
如上图,该树具有唯一根节点r,它的子树是以a、b、c为根节点的三棵树。而子树a下面还有一颗子树d。
从递归中我们发现,一棵树是N个节点和N−1条边的集合,其中的一个节点叫做根。存在N−1条边的结论是由下面的事实得出的,每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲。
1.2 节点
在上图中,节点r是根。节点a有一个父亲并且儿子d、e。每一个节点可以有任意多个儿子,也可能是零个儿子。没有儿子的节点称为树叶(leaf);上图中的树叶是e、f、g、h、i、j和k。
具有相同父亲的节点称为兄弟(sibling),比如a、b和c节点都是兄弟节点;用类似的方法可以定义祖父(grandfather)和孙子(grandchild)。
森林:两颗或两颗以上互不相交的树的集合。
1.3 深度和高度
节点的层次(Level)从根开始定义起,这里规定,根为第一层,根的孩子为第二层。若某节点在第i层,则其子树就在第i+1层。树中节点的最大层次称为树的深度(Depth)或高度,上图中,树的深度为4。
本文约定:从上往下数就是深度,从下往上数就是高度。另外由于不同的参考书对于根节点深度和高度的定义不一样,而节点的深度和高度会受到根节点的深度0还是1的影响,本文取根节点深度为1。一棵树的深度等于它的最深的树叶的深度;该深度总是等于这棵树的高度。
上图中,根节点r的深度为1,高度为4。子节点b的深度为2,高度为2。
1.4 节点的度
树的节点包含一个数据元素及若干指向其子树的分支。节点拥有的直接子节点数称为该节点的度(De-gree)。
度为0的节点称为叶节点(Leaf)或终端节点;度不为0的节点称为非终端节点或分支节点。
除根节点之外,分支节点也称为内部节点。树的度是树内各节点的度的最大值。上图中,因为这棵树节点的度的最大值是节点r和d的度,为3,所以树的度也为3。
1.5 有序性
无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树。
2 树的通用实现
树也可以采用顺序存储结构和链式存储结构实现。下面有三种通用的树实现的方法。后面介绍特殊的树时,比如二叉树、红黑树等它们还有自己的特殊实现方式。
2.1 父节点表示法
采用顺序存储结构来实现树,底层采用数组来存储节点。由于子节点具有唯一的父节点,因此,可以采用父节点表示法表示出一棵树的结构。
节点由数据域和父节点的索引位置组成,根节点的父节点索引为-1。
上图的树,使用最简单的父节点表示法可以表示为:
index(数组索引) data(数据域) parent(父节点索引) 0 r -1 1 a 0 2 b 0 3 c 0 4 d 1 5 e 1 6 f 2 7 g 3 8 h 3 9 i 4 10 j 4 11 k 4 树节点的设计可以是:
/** * 树节点的设计 * * @param <E> E类型 */ private static class TreeNode<E> { //数据域 E e; //父节点的索引 int parent; public TreeNode(E e, int parent) { this.e = e; this.parent = parent; } }
这样的存储结构,我们可以根据结点的parent索引很容易找到它的双亲结点,所用的时间复杂度为O(1),直到parent为-1时,表示找到了树结点的根。但是如果要知道孩子节点是什么,那就需要遍历整个数组才行。
2.2 父子节点链表示法
为了能够直观的找到一个节点的孩子节点。在原节点中添加一个子节点链表,原节点保存子节点链表的头索引,同时节点保存着父节点的索引。这需要一种新的孩子节点。
index(数组索引) data(数据域) parent(父节点索引) child(子节点链表头索引) 0 r -1 a->b->c->null 1 a 0 d->e->null 2 b 0 f->null 3 c 0 g->h->null 4 d 1 i->j->k 5 e 1 null 6 f 2 null 7 g 3 null 8 h 3 null 9 i 4 null 10 j 4 null 11 k 4 null 树节点和子节点的设计可以为:
/** * 树节点的设计 * * @param <E> E类型 */ private static class TreeNode<E> { //数据域 E e; //父节点的索引 int parent; //第一个子节点的引用 TreeNodeChild<E> firstChild; public TreeNode(E e, int parent, TreeNodeChild<E> firstChild) { this.e = e; this.parent = parent; this.firstChild = firstChild; } } /** * 子节点链表结构 * * @param <E> */ private static class TreeNodeChild<E> { //子节点的索引 int index; //下一个子节点的索引 TreeNodeChild<E> next; public TreeNodeChild(int index, TreeNodeChild<E> next) { this.index = index; this.next = next; } }
2.3 父子兄弟表示法
对于上面的父节点表示法和父子节点表示法,不能很方便的得知节点的兄弟节点。
实际上,我们观察树形结构后发现,任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个索引,分别指向该结点的第一个孩子和此结点的右兄弟。只需要两个引用就能很方便的表示出节点的唯一对应关系。
为了突破节点数量限制,我们可以使用链表。为了找到父节点,我们还可以添加父节点索引。
data(数据域) parent(父节点引用) child(第一个子节点引用) right(节点右兄弟引用) r null a null a r d b b r f c c r g null d a i e e a null null f b null null g c null h h c null null i d null j j d null k k d null null 节点可以统一设计为如下,不需要额外的节点结构:
/** * 树节点的设计 * * @param <E> E类型 */ private static class TreeNode<E> { //数据域 E e; //父节点的引用(可选) TreeNode<E> parent; //第一个子节点的引用 TreeNode<E> firstChild; //右兄弟节点的引用 TreeNode<E> rightBrother; }
使用示意图来直观的展示这种表示法的效果:
图中只标出了子节点和兄弟节点的引用链,红色为子节点引用,黑色为右兄弟节点的引用。我们看到,只需要这两个引用关系就能表示出一颗完整的树。并且需要查找某个节点的子节点或者父节点或者兄弟节点时,不需要完整遍历整颗树。
上面的表示方法,每个节点最多包括两个引用节点(不计算父节点引用),实际上这样的表示方法,把复杂的多子节点的树,表示成了一颗简单的二叉树:
这种表示法将是以后最常用的方法,二叉树将是我们在以后用到的最多的树种之一。
3 总结
本文作为树这种数据结构的入门文章,详细讲解了树以及各种专业术语的定义和解释,然后讲解了树的通用实现,讲了父节点表示法、父子节点链表示法、父子兄弟表示法。实际上后面的特性化的数据结构比如二叉树、AVL树、红黑树,均有自己的表示方法。但是上面这几种方法作为树的通用实现,还是可以了解一下的。
最后提到了二叉树,二叉树将是我们在以后用到的最多的树种之一,内容非常繁多,在此不做介绍,本文作为树的入门文章,在后续的文章中,将慢慢介绍二叉树等特性化的树。
相关文章:
- 《大话数据结构》
- 《算法图解》
- 《算法》
如果有什么不懂或者需要交流,可以留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!
-
java基础数据结构-树
2011-12-26 00:57:52java基础笔记数据结构-树,详细描述了树的原理及其实现方式,基础数据结构。 -
基于JAVA建立树形结构的算法优化.pdf
2021-07-02 19:02:54基于JAVA建立树形结构的算法优化.pdf -
java将list转为树形结构的方法(后台和前台)
2021-01-20 12:44:36前台: function listToTree(myId,pId,list){ function exists(list, parentId){ for(var i=0; i<list.length; i++){ if (list[i][myId] == parentId) return true; } return false; -
Java数据结构和算法中文第二版源码
2015-09-01 12:02:09Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验... -
java数据结构和算法(第二版)
2012-11-29 21:12:37Java数据结构的类库 小结 问题 第2章数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 ... -
JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
2020-10-22 18:06:55崇德易城市数据 -
JAVA后台转换成树结构数据返回给前端的实现方法
2020-08-19 11:21:28主要介绍了JAVA后台转换成树结构数据返回给前端的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
java源码结构-Tree-Data-Structure-in-Java:Java中树数据结构问题的源代码表示
2021-05-24 19:38:19java原始结构Java中的树数据结构 Java中树数据结构问题的源代码表示 -
Java数据结构与算法中文版
2018-05-23 21:48:53深入了解Java的数据结构,了解排序算法的实现,链表、树的实现等等;以及如何优化代码 -
Excel树形结构数据导入Oracle数据库(Java)
2019-07-28 06:12:33NULL 博文链接:https://hahawowo.iteye.com/blog/783874