JAVA用树结构实现目录系统

时间:2023-01-20 05:23:36

1使用 第一个儿子/下一兄弟表示法 来表示树

树节点定义如下:

private class TreeNode
{

String data;
TreeNode firstChild;
TreeNode nextSibling;
public TreeNode(String data, TreeNode firstChild,
TreeNode nextSibling) {
super();
this.data = data;
this.firstChild = firstChild;
this.nextSibling = nextSibling;
}
}

如下图所示:
JAVA用树结构实现目录系统
这是一棵树
JAVA用树结构实现目录系统
这是 上图所表示的树的第一儿子/下一兄弟表示法

如何读取指定文件夹的所有文件名,可以参考这篇文章中的方法
http://blog.csdn.net/aa8568849/article/details/52670133
在此基础上加入文件名存储进树,和输出树中的内容
程序效果如下:
JAVA用树结构实现目录系统
代码如下:

import java.io.File;

/*
*
*
*/

public class P78_tree//存储指定文件夹所有文件名的 树类
{

private TreeNode root=new TreeNode(null, null, null);//树根(相当于链表的头指针)
public TreeNode getRoot()//获取树根
{
return root;
}
/*
* 函数名:getFile
* 作用:实现将指定文件夹的所有文件存入树中
*/

public void getFile(String path,TreeNode treeNode)
{
File file=new File(path);
File[] array=file.listFiles();
TreeNode newNode=null;
for(int i=0;i<array.length;i++)
{
newNode=new TreeNode(array[i].getName(),null, null);
//判断当前节点有没有firstChild,没有的话为其添加一个
if (treeNode.firstChild==null)
{
if (array[i].isFile())
treeNode.firstChild=newNode;
if (array[i].isDirectory())
{
treeNode.firstChild=newNode;
getFile(array[i].getPath(), newNode);
}
}
//当前节点已经存在firstChild,所以后面的都是firstChild节点的兄弟
else
{
TreeNode p=treeNode.firstChild;
while(p.nextSibling!=null)
p=p.nextSibling;
if (array[i].isFile())
p.nextSibling=newNode;
if (array[i].isDirectory())
{
p.nextSibling=newNode;
getFile(array[i].getPath(), newNode);
}
}
}
}
/*
* 函数名:printTree
* 作用:输出树中的内容
*/

public void printTree(TreeNode root,int deep)
{
if (root.data!=null) //这个if是为了区分root节点,因为root节点data=null
{
for (int i = 0; i < deep; i++)//输出前置空格
System.out.print(" ");
System.out.println(root.data);
}
//画一下图,就能理解这个两个if
if (root.firstChild!=null)
printTree(root.firstChild, deep+1);
if (root.nextSibling!=null)
printTree(root.nextSibling, deep);

}
//树节点两个指针,一个指向第一个儿子 一个指向兄弟
private class TreeNode//树节点类
{

String data;
TreeNode firstChild;//第一儿子链
TreeNode nextSibling;//下一兄弟链
//构造器
public TreeNode(String data, TreeNode firstChild,TreeNode nextSibling)
{
super();
this.data = data;
this.firstChild = firstChild;
this.nextSibling = nextSibling;
}
}
public static void main(String[] args)
{
P78_tree test=new P78_tree();
test.getFile("/Users/XXY/Desktop/test",test.getRoot());
test.printTree(test.root, 0);
}
}