最近在毕业设计过程中,还是要考虑层状树型数据的存储表示以及各项操作。

数据定义

将树的的每一个节点用一个数据项表示

# 节点的唯一标识 【不许为空】
- 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;