Java基础复习笔记07数据结构树的概述Word文档下载推荐.docx
- 文档编号:17982034
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:20
- 大小:28.37KB
Java基础复习笔记07数据结构树的概述Word文档下载推荐.docx
《Java基础复习笔记07数据结构树的概述Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Java基础复习笔记07数据结构树的概述Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
那么我们访问这个节点的时候,实际上父节点也能间接的获取到了。
其实我们在做很多数据库设计的时候,遇到一个树形菜单基本上都是采用这种记父方式来实现的。
其实很多的看似二维的结构,数据库记录,都可以提取出相应的一种图形化的模型。
就像UML的类图关系就完全可以转化成关系型结构化数据库表模型,而数据库表结构也能提取出相应的领域模型一样。
主键
数据
父节点主键
根菜单
-1
1
子菜单1
2
子菜单2
3
子菜单11
上面的二维表结构可以描绘成以下结构
算法如下:
packagedateStructer.tree;
importjava.util.ArrayList;
importjava.util.List;
publicclassTreeParent<
E>
{
/**
*节点结构
*/
publicclassNode<
T>
//真正的数据域
privateEdate;
//记录父节点的索引位置
privateintparentIndex;
publicNode(){
}
publicNode(Edate,intparentIndex){
this.date=date;
this.parentIndex=parentIndex;
@Override
publicbooleanequals(Objectobj){
if(((Node)obj).date==this.date
&
&
((Node)obj).parentIndex==this.parentIndex)
returntrue;
returnfalse;
publicinthashCode(){
returnsuper.hashCode();
publicStringtoString(){
return(String)date;
}
//默认数组大小
privatefinalintDefSize=150;
//记录节点个数
privateintnodeSize;
//父节点对象
privateNode<
[]nodes;
publicTreeParent(){
nodes=newNode[DefSize];
publicTreeParent(Ee){
nodeSize++;
nodes[0]=newNode(e,-1);
*为指定节点增加子节点
*
*@parame
*@paramparentNode
*@return
publicbooleanaddNodeByParent(Ee,Node<
parentNode){
for(inti=0;
i<
nodes.length;
i++){
if(nodes[i]==null){
intparentNodeIndex=getNodeIndex(parentNode);
nodes[i]=newNode<
(e,parentNodeIndex);
nodeSize++;
}
returnfalse;
*根据node获得索引
*@paramnode
publicintgetNodeIndex(Node<
node){
if(nodes[i].equals(node)){
returni;
return-1;
*判断是否是空树
publicbooleanisEmpty(){
returnnodeSize==0;
*返回树的根节点
publicNode<
getRootNode(){
if(nodeSize==0){
returnnull;
returnnodes[0];
*根据子节点返回父节点对象
*@paramchileNode
getParentNodeByChildNode(Node<
chileNode){
nodeSize;
if(chileNode==null){
returnnull;
if(i==chileNode.parentIndex){
returnnodes[i];
returnnull;
*根据父节点返回子节点对象集合
if(chileNode==null){
returnnodes[chileNode.parentIndex];
*返回指定节点的第index个子节点,第1个代表第一个
*@paramindex
getIndexChildByParentNode(Node<
parentNode,intindex){
if(index==0){
thrownewRuntimeException("
没有第0个子节点,从1开始"
);
intchildCount=0;
intparentIndex=getNodeIndex(parentNode);
if(nodes[i].parentIndex==parentIndex){
++childCount;
if(childCount==index){
returnnodes[i];
}
*返回节点的深度
publicintreturnNodeDeep(Node<
if(node==getRootNode()){
return1;
}else{
Node<
parentNode=getParentNodeByChildNode(node);
if(parentNode!
=null){
returnreturnNodeDeep(parentNode)+1;
return0;
*返回树的深度
publicintreturnTreeDeep(){
intmax=0;
intnodeDeep=returnNodeDeep(nodes[i]);
if(max<
nodeDeep){
max=nodeDeep;
returnmax;
@Override
publicStringtoString(){
StringBufferstr=newStringBuffer("
["
str.append("
+nodes[i].date+"
],"
if(nodeSize>
0){
returnstr.substring(0,str.lastIndexOf("
"
))+"
]"
;
returnstr.append("
).toString();
}
测试代码
publicstaticvoidmain(String[]args){
TreeParent<
String>
tree=newTreeParent<
("
根菜单"
.Node<
root=tree.getRootNode();
tree.addNodeByParent("
子菜单1"
root);
子菜单2"
node1=tree.getIndexChildByParentNode(root,1);
子菜单11"
node1);
System.out.println("
树的数据:
"
+tree);
节点的深度:
+tree.returnNodeDeep(node1));
+tree.returnNodeDeep(root));
node11=tree.getIndexChildByParentNode(node1,1);
+tree.returnNodeDeep(node11));
+tree.returnTreeDeep());
测试效果如下
[[根菜单],[子菜单1],[子菜单2],[子菜单11]]
记父节点是让树的节点记住自己节点的父节点索引位置,可以根据索引查找父节点,查找某个节点的父节点自然是手到擒来了,但是查找某个节点的子节点就略显笨拙,得遍历整个树的存储数组。
5.树的记子节点实现
与记父节点不同的是,记子节点实现是Node节点记录的是自己子节点的信息,之后利用第一个子节点记录第二个子节点信息、利用第二个子节点记录第三个字节点信息,以此类推。
也就是说子节点对象就是记录父节点的子节点信息的。
第n个节点记录了第n+1个子节点的信息。
代码如下
publicclassTreeChildren<
*记录子节点对象
*@authorliuyan
classSonNode<
Edata;
intindex;
SonNode<
sonNode;
publicSonNode(Edata,intindex,SonNodesonNode){
this.data=data;
this.index=index;
this.sonNode=sonNode;
return(String)data;
publicNode<
paseNode(){
returnnewNode<
(data,index);
*实际应用的Node对象
classNode<
SonNodefirstSonNode;
publicNode(Edata,intindex){
publicNode(Edata,intindex,SonNodesonNode){
this.firstSonNode=sonNode;
if(((Node)obj).data==this.data
((Node)obj).index==this.index)
publicTreeChildren(){
publicTreeChildren(Ee){
nodes[0]=newNode(e,0);
@SuppressWarnings("
unchecked"
)
SonNodesonNode=newSonNode(e,i,null);
SonNodelastSonNode=getLastSonNodeByParent(parentNode);
if(lastSonNode==null){
parentNode.firstSonNode=sonNode;
}else{
lastSonNode.sonNode=sonNode;
nodes[i]=sonNode.paseNode();
*由SonNode到普通Node的转化
*@paramsonNode
paseNode(SonNode<
sonNode){
if(nodes[i]!
=null&
nodes[i].data==sonNode.data
nodes[i].index==sonNode.index){
*获得一个父节点的最后子节点对象
publicSonNodegetLastSonNodeByParent(Node<
if(parentNode.firstSonNode==null){
SonNodesonNodeNow=parentNode.firstSonNode;
while(sonNodeNow.sonNode!
=null){
sonNodeNow=sonNodeNow.sonNode;
returnsonNodeNow;
nodes[i].firstSonNode!
SonNode<
sonNode=nodes[i].firstSonNode;
while(sonNode!
if(sonNode.data==chileNode.data
&
sonNode.index==chileNode.index){
returnnodes[i];
}
sonNode=sonNode.sonNode;
*根据父节点返回父子节点对象集合
publicList<
SonNode<
>
getChildsNodeByParentNode(Node<
if(parentNode==null){
sonNodeNow=parentNode.firstSonNode;
List<
list=newArrayList<
();
list.add(s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 基础 复习 笔记 07 数据结构 概述