JAVA用樹結構實現目錄系統
阿新 • • 發佈:2019-02-07
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;
}
}
如下圖所示:
這是一棵樹
這是 上圖所表示的樹的第一兒子/下一兄弟表示法
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);
}
}