-
2020-05-25 10:40:12更多相关内容
-
Java中树的存储结构实现示例代码
2020-08-29 08:12:56本篇文章主要介绍了Java中树的存储结构实现示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
java算法非常详细的树,图,存储结构
2011-01-01 12:27:36java算法,非常详细的树,图,存储结构 -
JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
2020-10-22 18:06:55崇德易城市数据 -
BPlusTree:Java - 使用 B+ 树的大数据存储
2021-07-13 06:57:01BPlus树 Java - 使用 B+ 树的大数据存储 -
JAVA技能树(技术面试知识点汇总)
2018-10-14 16:03:49JAVA面试技能点总结,深入源码及原理分析,设计JAVA基础、多线程、同步机制、JAVA虚拟机、GC、异常、反射、SPRING事务原理、MYSQL存储引擎及原理、REDIS、EHCACHE、MYCAT、KAFKA、MQ等 -
R树的Java实现
2019-08-08 01:02:04NULL 博文链接:https://zhengliang.iteye.com/blog/2145859 -
Java 将有父子关系的数据转换成树形结构数据
2021-01-07 07:52:24大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL COMMENT '主键', `parent_id` ... -
java编程无向图结构的存储及DFS操作代码详解
2020-08-28 14:52:49主要介绍了java编程无向图结构的存储及DFS操作代码详解,具有一定借鉴价值,需要的朋友可以了解下。 -
Java实现字典树TrieTree
2015-08-19 13:00:59Java实现字典树TrieTree,可用于计算出四六级试题的高频词. -
一棵Java字典树(trie)和它的增删改查
2021-01-20 02:16:42一棵用List来存储子结点的字典树——当然,也可以用哈希表等形式存储。 这篇笔记记录了构建思路,文末是源码 一、构建思路 Step1 设计结点——数据结构 Step2 实现相应的操作方法——增删改查 Step1 设计结点 我们... -
java实现赫夫曼树编码和解码byte[]
2020-12-21 15:21:43首先对于赫夫曼编码有个大概...(举例来说,对于一个字符串中”i like java do you like a java”中有多个重复字符,我们可以存储一次一个字符对应的编码即可,可以节省存储空间) ;网上大多数用的是char来进行字符个数 -
Java_Algorithm_Project:这个存储库包含我的数据结构和算法项目,使用 Java 中的红黑树操作和列表操作
2021-07-07 14:26:35Java_Algorithm_Project 作者:Yirong Zhu 作者 Linkedin: 描述:这个存储库包含我在 Java 中使用红黑树操作和列表操作的数据结构和算法项目 -
GourmetGame:Java中决策树的实现
2021-05-18 17:13:02美食游戏 美食游戏是Java中决策树的实现。 其目的是猜测用户正在考虑的食物种类。 如果无法猜测,它将询问用户该板的名称,特征并存储它,以了解新板。 -
JOCheckboxTreeTable:Java带有复选框的树表实现的开放源代码版本
2021-04-27 14:15:41TreeTable的Java开源版本,在树的一部分中带有复选框。 这个版本是eu.floraresearch.lablib.gui.checkboxtree(lablib-checkboxtree的artifactId)CheckboxTree版本的叉4.0-β-1: 来自eu.floraresearch.lablib.... -
Java 实现树结构
2021-02-12 09:34:11树是一种非常重要的数据结构,其中二叉树是最常用到的,之前学的时候用的都是c++,很长时间没有用了也忘得差不多了,最近一直都在用Java,所以总结一下怎样用java来实现二叉树的数据结构,用二叉树来存一个数组。...树是一种非常重要的数据结构,其中二叉树是最常用到的,之前学的时候用的都是c++,很长时间没有用了也忘得差不多了,最近一直都在用Java,所以总结一下怎样用java来实现二叉树的数据结构,用二叉树来存一个数组。
二叉树得特点有以下几个:1. 每个节点最多有两棵子树。2. 左子树和右子树是有顺序的,次序不能任意颠倒。3. 即使树中只有一课子树,也要区分他是左子树还是右子树;
二叉树的遍历:是指从根结点出发,按照某种次序,依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次;二叉树的遍历方式有好多种,如果我们限制了从左到右的习惯方式,那么主要就有以下几种:前序遍历,中序遍历,后序遍历和层序遍历。
二叉树的实现:二叉树也可以通过顺序存储和链式存储来实现;
二叉树的顺序存储就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如父结点与子结点的逻辑关系,子结点与子结点之间的关系;但顺序存储的实用性不强;所以一般采用链式存储;
在Java中,采用类来声明树的节点 如下所示
public class Node
{
private char
key; //
数据
private Node
left, right; //
左右子结点
public
Node(char key)
{
this(key, null, null);
}
public
Node(char key, Node left, Node right)
{
this.key = key;
this.left = left;
this.right = right;
}
public char
getKey()
{
return key;
}
public void
setKey(char key)
{
this.key = key;
}
public Node
getLeft()
{
return left;
}
public void
setLeft(Node left)
{
this.left = left;
}
public Node
getRight()
{
return right;
}
public void
setRight(Node right)
{
this.right = right;
}
}
接下来就是创建一个二叉树,以及对二叉树进行前序遍历,中序遍历,后序遍历和层序遍历。
public class Tree
{
protected
Node root;
public
Tree(Node root)
{
this.root = root;
}
public Node
getRoot()
{
return root;
}
//
初始化,构造二叉树
public
static Node init()
{
Node a = new Node('A');
Node b = new Node('B', null,
a);
Node c = new Node('C');
Node d = new Node('D', b, c);
Node e = new Node('E');
Node f = new Node('F', e,
null);
Node g = new Node('G', null,
f);
Node h = new Node('H', d, g);
return h; //
根结点
}
//
访问节点
public
static void visit(Node p)
{
System.out.print(p.getKey() +
" ");
}
//
递归实现前序遍历
protected
static void preorder(Node p)
{
if (p != null)
{
visit(p);
preorder(p.getLeft());
preorder(p.getRight());
}
}
//
递归实现中序遍历
protected
static void inorder(Node p)
{
if (p != null)
{
inorder(p.getLeft());
visit(p);
inorder(p.getRight());
}
}
//
递归实现后序遍历
protected
static void postorder(Node p)
{
if (p != null)
{
postorder(p.getLeft());
postorder(p.getRight());
visit(p);
}
}
//
非递归实现前序遍历
protected
static void iterativePreorder(Node p)
{
Stack stack = new Stack();
if (p != null)
{
stack.push(p);
while (!stack.empty())
{
p =
stack.pop();
visit(p);
if
(p.getRight() != null)
stack.push(p.getRight());
if
(p.getLeft() != null)
stack.push(p.getLeft());
}
}
}
//
非递归实现后序遍历
protected
static void iterativePostorder(Node p)
{
Node q = p;
Stack stack = new Stack();
while (p != null)
{
// 左子树入栈
for (; p.getLeft() != null; p = p.getLeft())
stack.push(p);
// 当前结点无右子结点或右子结点已经输出
while (p != null && (p.getRight() ==
null || p.getRight() == q))
{
visit(p);
q = p;
// 记录上一个已输出结点
if
(stack.empty())
return;
p =
stack.pop();
}
// 处理右子结点
stack.push(p);
p = p.getRight();
}
}
//
非递归实现中序遍历
protected
static void iterativeInorder(Node p)
{
Stack stack = new Stack();
while (p != null)
{
while (p != null)
{
if
(p.getRight() != null)
stack.push(p.getRight());
// 当前结点右子结点入栈
stack.push(p); // 当前结点入栈
p =
p.getLeft();
}
p = stack.pop();
while (!stack.empty() && p.getRight() ==
null)
{
visit(p);
p =
stack.pop();
}
visit(p);
if (!stack.empty())
p =
stack.pop();
else
p = null;
}
}
}
-
Json树形结构数据转Java对象并存储到数据库的实现-超简单的JSON复杂数据处理
2012-09-01 11:50:17那么在选择了省市县中的某一个城市 ,存储到数据库中需要存储所选城市的代码。所以需要一个能将JSON数据(一般存储在javascript脚本中)结构全部导入到数据库中的功能。 JSON的特点是支持层级结构、支持数组表示的...在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从JSON中而不是从数据库中获取省市县数据。那么在选择了省市县中的某一个城市 ,存储到数据库中需要存储所选城市的代码。所以需要一个能将JSON数据(一般存储在javascript脚本中)结构全部导入到数据库中的功能。
JSON的特点是支持层级结构、支持数组表示的对象 。下面的示例介绍如何将JSON的省市县数据保存到数据库中,实现原理非常简单,就是利用JSON的java工具包API,将层次结构的JSON对象数组通过递归的方式首选转换为Java对象数组,然后保存到数据库中。
实现步骤是:
(一)首先定义一个JsonItem实体类:
package org.openjweb.core.entity;
public class JsonItem
{
private String sub_id;
private String sub_name;
private JsonItem[] items;
public JsonItem[] getItems() {
return items;
}
public void setItems(JsonItem[] items) {
this.items = items;
}
public String getSub_id() {
return sub_id;
}
public void setSub_id(String sub_id) {
this.sub_id = sub_id;
}
public String getSub_name() {
return sub_name;
}
public void setSub_name(String sub_name) {
this.sub_name = sub_name;
}
}(二)定义一个工具类,在工具类中读取Json数据文件,并进行递归调用 :
public static String importJson(String fullFileName,String jsonType,String encoding,HttpServletRequest request) throws Exception
{
//Json转换为实体类参考:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html
String sReturn = "";
String jsonData = "";
try
{
jsonData = FileUtil.getTextFileContent(fullFileName, encoding);
}
catch(Exception ex)
{
sReturn ="读Json文件失败!";
}
//获取rootId
//logger.info("");
jsonData = jsonData.replace("\"items\":\"\"", ""); //去掉空的 items
String parentId = jsonData.substring(jsonData.indexOf("\"id\":")+5);
parentId = parentId.substring(0,parentId.indexOf(",")).trim();
parentId = parentId.replace("\"", "");
logger.info("root id=="+parentId);
String parentName = jsonData.substring(jsonData.indexOf("\"name\":")+7);
parentName = parentName.substring(0,parentName.indexOf(",")).trim();
parentName = parentName.replace("\"", "");
logger.info("root Name=="+parentName);
String rootData = jsonData.substring(jsonData.indexOf("\"items\":")+8,jsonData.lastIndexOf("}"));
rootData = jsonData.substring(jsonData.indexOf("[")+1,jsonData.lastIndexOf("]"));
//不同json的id,name表示不一样,统一换成sub_id,subname以便与JsonItem的类属性匹配
// 替换后方便统一处理
rootData = rootData.replace("city_id", "sub_id");
rootData = rootData.replace("sub_city", "sub_name");
rootData = rootData.replace("city", "sub_name");
rootData = rootData.replace("sub_txt", "sub_name");
rootData = rootData.replace("sub_industry", "sub_name");
rootData = rootData.replace("industry_id", "sub_id");
rootData = rootData.replace("industry", "sub_name");
rootData = rootData.replace("sub_profession", "sub_name");
rootData = rootData.replace("profession_id", "sub_id");
rootData = rootData.replace("profession", "sub_name");
//将rootData转换为array
rootData = "[" + rootData + "]";
try
{
FileUtil.str2file(rootData, "d:/jsonData.txt", "utf-8");//存储到磁盘检查字符串转换是否正确
}
catch(Exception ex)
{
}
JSONArray jsonArray = JSONArray.fromObject(rootData);
Object[] os = jsonArray.toArray();
JsonItem[] items = (JsonItem[]) JSONArray.toArray(jsonArray, JsonItem.class);
saveJsonEnt(jsonType,parentId,parentName,"-1",new Long(1));
dealJson(items,parentId,jsonType,new Long(1));
return sReturn ;
}
private static void saveJsonEnt (String jsonType,String jsonId,String jsonName,String parentId,Long levelId) throws Exception
{
logger.info(jsonType+"/"+jsonId+"/"+jsonName+"/"+parentId+"/"+String.valueOf(levelId));
CommJsonData ent = new CommJsonData();
ent.setJsonType(jsonType);
ent.setJsonCode(jsonId);
ent.setJsonName(jsonName);
ent.setRowId(StringUtil.getUUID());
ent.setParentCode(parentId);
ent.setLevelId(levelId);
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean("IDBSupportService3");
service.saveOrUpdate(ent);
}
private static String dealJson(JsonItem[] jsonItem,String parentId,String jsonType,Long level)
{
String sReturn = "";
if(jsonItem!=null&&jsonItem.length>0)
{
for(int i=0;i<jsonItem.length;i++)
{
JsonItem ent = jsonItem[i];
//System.out.println(ent.getSub_id());
//System.out.println(ent.getSub_name());
try
{
saveJsonEnt(jsonType,ent.getSub_id(),ent.getSub_name(),parentId,level+1);
}
catch(Exception ex)
{
ex.printStackTrace();
}
if(ent.getItems()!=null)
{
//System.out.println("子项数:"+ent.getItems().length);
dealJson(ent.getItems(),ent.getSub_id(),jsonType,level+1);
}
else
{
//System.out.println("没有子项!");
}
}
}
//此函数
return sReturn ;
}示例数据(部分):
{
"name": "全国",
"id": "0000000000",
"description": "崇德易城市数据",
"modified": "2012年08月",
"copyright": "http://www.chongdeyi.com/",
"items": [
{
"city": "北京市",
"city_id": "1001000000",
"items": [
{
"sub_city":"东城区",
"sub_id":"2001001000"
},
{
"sub_city":"西城区",
"sub_id":"2001002000"
},
{
"sub_city":"朝阳区",
"sub_id":"2001006000"
},
{
"sub_city":"丰台区",
"sub_id":"2001007000"
},
{
"sub_city":"石景山区",
"sub_id":"2001008000"
},
{
"sub_city":"海淀区",
"sub_id":"2001009000"
},
{
"sub_city":"门头沟区",
"sub_id":"2001010000"
},
{
"sub_city":"房山区",
"sub_id":"2001011000"
},
{
"sub_city":"通州区",
"sub_id":"2001012000"
},
{
"sub_city":"顺义区",
"sub_id":"2001013000"
},
{
"sub_city":"昌平区",
"sub_id":"2001014000"
},
{
"sub_city":"大兴区",
"sub_id":"2001015000"
},
{
"sub_city":"怀柔区",
"sub_id":"2001016000"
},
{
"sub_city":"平谷区",
"sub_id":"2001017000"
},
{
"sub_city":"延庆县",
"sub_id":"2001018000"
},
{
"sub_city":"密云县",
"sub_id":"2001019000"
}]
},{
"city": "天津市",
"city_id": "1002000000",
"items": [
{
"sub_city":"和平区",
"sub_id":"2002001000"
},。。。
-
Java数据结构-树及树的存储结构
2015-07-23 00:06:45树的定义:n(n>=0)个节点的有限集。 n=0时称为空树。 n!=0时为非空树,有且仅有一个特定的节点——根;n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树...树的定义:n(n>=0)个节点的有限集。
- n=0时称为空树。
- n!=0时为非空树,有且仅有一个特定的节点——根;n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树。
树的一些基本术语:
- 树的结点:由一个数据元素和若干个指向其子树的分支组成。
- 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度。
- 叶子结点:度为0的结点称为叶子结点,或者称为终端结点。
- 分支结点:度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点由叶子结点和分支结点组成。
- 孩子、双亲、兄弟:树中一个结点的子树的根结点称为这个结点的孩子;这个结点称为它孩子结点的双亲;具有同一个双亲的孩子结点互称为兄弟。
- 路径、路径长度:如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(i为1~k,不等于k的值),就把n1,n2,…,nk称为一条由n1至nk的路径。路径长度是指路径上经过的边的数量,所以这条路径的长度是k-1。
- 祖先、子孙:在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。
- 结点的层数:规定树的根结点的层数为1,其余结点的层数等于它双亲结点的层数加1。
- 树的深度(高度):树中所有结点中的最大层数称为树的深度。
- 树的度:树中各结点中度的最大值称为该树的度。
- 有序树、无序树:如果一棵树中结点的各子树从左到右都是有次序的,不能交换的,称这棵树为有序树;反之为无序树。
- 森林:m(m>=0)棵互不相交的树的集合。
- 同构:对于两棵树,若通过对各结点适当重命名,就可以使这两棵树完全相等(结点对应相等,结点关系也相等),称这两棵树同构。
- 层序编号:将书中结点按照从上层到下层、同层从左到右的次序依次给它们编号1开始的自然数。
线性结构和树结构的比较:
树的存储结构:
双亲表示法:
(用一组连续空间来存储树的结点)
在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。
结点的结构如下:
下面演示一下双亲表示法:约定根结点的指针域设为-1;
这个方法通过结点只要花O(1)的时间就可以访问到此结点双亲结点,但是要找到其孩子结点却需要遍历整棵树。需要改进;
改进版一:增加最左孩子(长子)结点指针域;如下:
改进版二:增加右兄弟结点指针域;如下:
可以根据需求来进行改进,灵活的设计存储结构。多重链表表示法:
(用多重链表来实现)
每个结点有多个指针,其中每个指针指向一棵子树的根结点,这种方法叫多重链表表示法。
方案一:
指针域的个数等于树的度;结构如下:
举例上图的树的度为3,所以指针域的个数为3,方法的实现如下:
解释:对于树中各结点的度相差很大时,是很浪费空间的;如果各结点的度相差很小时,空间是被充分利用的。
根据按需分配空间的想法,于是我们有了第二组方案。
方案二:
每个结点指针域的个数等于该结点的度,通过设置一个位置来存储结点指针域的个数;结构如下:
于是乎上述图可以画出该方案的实现:
解释:该方法客服了空间上的浪费,但是由于链表的结构不同以及需要维护结点的度的数值,因此在运算上就是在时间上有所消耗。孩子表示法:
利用数组来存放数组的结点,利用单链表来存放结点的孩子结点。
演示上述图例结构如下:
解释:
表头数组的的结构;data是数据域,存储结点的数据信息;firstchild是头指针,存储该结点的孩子链表的头指针。
孩子链表的结构:child是数据域,存储某个结点在表头数组中的下标;next是指针域,用来存储指向某结点的下一个孩子结点的指针。改进版:孩子双亲表示法:
在表头数组中增加一个parent域,用来保存指向双亲结点的指针。孩子兄弟表示法:
结构如下:
解释:data是数据域;firstchild为指针域,存储该结点的长子的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。
这样上述图中所述树的实现如下:
如果想找到双亲,可以增加一个双亲指针。后续继续讲解二叉树。
-
【数据结构】树-二叉树的存储结构(大篇幅图解、c++、java)
2022-01-17 16:34:21URLeisure的二叉树的存储结构“完美”复习资料。 -
java多叉树的遍历
2019-01-23 08:54:26用过了二叉树后,正好业务上有一个需求,就是需要求出从根节点到每个叶子节点的路径集合,由于不是二叉树,而是如同一种多叉树的结构,下面来看具体代码, 1、节点对象,包含3个属性,当前节点Id,持有的父节点Id,... -
数据库存储树结构ClosureTableCateogryStore-master.zip
2020-02-27 22:15:43参考本人csdn上的文章,配合看代码,会简单些。这里给出了用数据库怎么存储一棵树。采用java实现。一般来说对于树结构,使用结构化数据库存储是一个麻烦的事情。 -
jsnip:用于存储和运行 Java 片段的桌面应用程序
2021-06-18 22:14:02JSnip 是一个桌面 Java 应用程序,可以轻松存储、管理和执行 Java 代码片段。 片段可以存储在层次结构中,保存到文件中并从文件加载。 节点可以随意添加到树中,也可以从树中删除。 JSnip 使用库来执行代码片段。 ... -
字典树(java实现)
2020-05-13 11:30:23字典树(java实现) -
树的存储结构的设计及递归遍历(前序,后序,层序)算法实现——【Java数据结构与算法笔记】
2022-01-11 14:22:12文章目录树的定义及基本术语树的定义树的基本术语树的遍历先序遍历后序遍历层序遍历树的存储结构双亲表示法代码实现线性结构和树结构的比较二叉树二叉树定义二叉树的基本术语满二叉树完全二叉树 树的定义及基本术语 ... -
基于Java的minio相关操作示例
2020-10-15 16:44:19基于springboot的小型Java项目,主要与minio存储有关,包含了各种minio相关操作,包括新建bucket存储桶、查询文件列表、文件上传、下载、预览等。个人资源,请勿转载 -
knowledge-collector:用于本地存储个人知识的独立 Java 应用程序
2021-06-19 10:01:46用于本地存储个人知识的独立 Java 应用程序 需要安装 。 文件和文件夹的树状结构 链接到 Internet 资源 链接到本地资源 便笺簿写(笔记,想法) 在树中创建所需的对象 显示/隐藏有关对象树的详细信息(描述、... -
JAVA多叉树森林的构造、内存存储、磁盘存储与层序、先序(深度)遍历
2018-06-20 10:25:08因为项目需要简历一个森林来保存图形之间的父子关系,因此建立一种多叉树作为验证模型。具体原理如下草稿所示:实现代码如下:package com.test.forest; import java.util.ArrayList; import java.util.List; ... -
Java实现对多叉树的操作
2019-09-01 21:06:17Java多叉树前言我们实现下面这颗树Show Code?节点对象多叉树对象测试测试代码测试效果 前言 前段时间遇到的一个需求,前台需要实现一个类似于思维导图的页面,并且就一个页面,项目不是思维导图项目。 所以打算以... -
《数据结构与算法之哈夫曼树(Java实现)》
2021-07-02 20:41:30哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度... -
java List 转树结构
2019-08-30 17:28:30需求 ,将如下类似的list 转换成如下树结构 { "code":200, "data":{ "gridName":"全部", "child":[ { "id":1, "gridName":"华东区", "gridCo...