毕业设计想法2
最近在毕业设计过程中,还是要考虑层状树型数据的存储表示以及各项操作。
数据定义
将树的的每一个节点用一个数据项表示
# 节点的唯一标识 【不许为空】
- code:String 唯一表示名
- id:Long 唯一id
- sequence:Integer 节点所在层的序号
- value:Integer 节点的值
# 节点的基础信息
- level:Integer 节点所在层
# 节点的引用信息 【不许为空】
- pcode:String 父级节点的唯一标识名
- pcodes:String 到根节点的标识名组,用','分割
- pid:String 父级节点的唯一id
- pids:String 到根节点的id组,用','分割
# 节点的状态信息 【不许为空】
- status:Integer 节点状态标识:有效、无效、被删除
算法描述
事先约定
虚拟出一个根节点,其中用 0
表示根节点的id,用"0"
表示根节点的名。
默认defaultLevel=1;
,默认序号sequence=1
,默认使用尾插。
节点操作
查找结点
注意查找结点有以下三种方式
1.标识名code
2.层级level
和序号sequence
3.唯一idid
若查找不到需要返回null
添加节点
注意对节点的增加需要给出以下必须元素
1.标识名code
2.层级level
和序号sequence
,
3.父节点的信息(id、code或引用值)
增加时应该判断标识名是否重复,所需元素不为空且存在
然后查询该位置是否有相同元素,若有存在需要将后面的节点序号(sequence+1)修改腾出位置;
进行添加操作
修改节点
注意对节点的修改如果要修改必须元素,需要进行校验
1.修改标识名code
标识名是否重复
2.修改层级level
和序号sequence
确保存在且大于0
3.修改非本层层级需要重新告诉引用父节点的信息(id、code或引用值)
需要特别注意id不允许修改。
然后查询该位置是否有相同元素,若有存在需要将后面的节点序号(sequence+1)修改腾出位置;
进行修改操作
删除节点
删除节点首先调用查找结点,查找到了进行删除
但是需要注意的是删除节点应该同时删除该节点的所有子节点
层级序号操作
层级
包括层级数、最大层和最小层
序号
需要给出层级数
然后查询查询该层级的最大序号(最小序号默认1)
得到该层级的节点
需要给出层级数
然后查询该层级的所有结点
关系操作
关系操作指的是对单个节点的关系操作,需要先找到这个节点,若存在则继续。
得到所有同级节点列表
获取该节点的层级
然后调用层级操作得到该层级的节点(层级数)
得到父节点
通过该节点引用信息查找父节点
如果该节点引用虚拟根节点则返回null
得到子节点列表
子节点可能有、可能也没有,有的话可能有多个
子节点共有特征是ChildrenNodeLevel=parentNodeLevel+1
和节点引用信息等于父节点的信息值
使用共有特征查找子节点
得到所有父节点
得到到虚拟根节点的所有父节点列表用两种方法,递归和分离引用值进行值
这里采用递归查询方式
List<Node> allParentNodeList = new List();
Node parentNode = getParentNode(node);
while(Node.pnum!=0) {
allParentNodeList.add(parentNode);
parentNode = getParentNode(parentNode);
}
得到所有子节点
得到所有子节点只有递归一种方法
List<Node> allChildrenNodeList = new List();
int index = 0;
List<Node> childrenNodeList = getChildrenNodeList(node);
if(ChildrenNodeList!=null) {
if(!ChildrenNodeList.isEmpty()) {
allChildrenNodeList.addAll(ChildrenNodeList);
while(index<allChildrenNodeList.size()) {
List<Node> list = getChildrenNodeList(allChildrenNodeList.get(index));
if(list!=null) {
if(!list.isEmpty()) {
allChildrenNodeList.addAll(list);
}
}
}
return allChildrenNodeList;
}
}
return null;
评论已关闭