1.树的优点
与链表相比,其访问时间更快,大部分操作的时间小于O(logn)
2.树的应用
文件系统、算术运算
3.基本概念
儿子、父亲、兄弟、祖父、孙子、树叶、深度、高度、路径、祖先、真祖先、后裔、真后裔
4.基本性质
(1)具有N个节点的树有N-1个节点
(2)树的深度等于它的最深的树叶的深度,等于这棵树的高
5.树的实现
由于儿子节点个数不确定(不一定是二叉树),故不能像二叉树那样实现,即父节点包含指向所有子节点的指针。可以采用递归的方式实现(使用链表),即除了数据元素外,还有指向子节点和兄弟节点的指针。
图1. 树节点的声明
6.树的应用——文件系统目录打印以及文件夹大小计算
(1)文件目录如下:
图2. 文件目录
(2)思路
a.对于目录打印问题,采用的先序遍历
b.而对于文件夹大小计算,采用的是后序遍历,即先要计算该文件夹下所有子文件夹的大小才能知道目前文件夹的大小
c.类的结构
(3)实现代码
1 /** 2 * 3 */ 4 package tree1_FileOperater; 5 6 public class main { 7 8 public static void main(String[] args) { 9 // TODO 自动生成的方法存根 10 fileTree a1=new fileTree("/usr*",1); 11 fileTree a2=new fileTree("mark*",1,a1); 12 fileTree a3=new fileTree("alex*",1,null,a2); 13 fileTree a4=new fileTree("bill*",1,null,a3); 14 fileTree a5=new fileTree("book*",1,a2); 15 fileTree a6=new fileTree("course*",1,null,a5); 16 fileTree a7=new fileTree("junk.c",6,null,a6); 17 fileTree a8=new fileTree("junk.c",8,a3); 18 fileTree a9=new fileTree("work*",1,a4); 19 fileTree a10=new fileTree("course*",1,null,a9); 20 fileTree a11=new fileTree("chl.r",3,a5); 21 fileTree a12=new fileTree("ch2.r",2,null,a11); 22 fileTree a13=new fileTree("ch3.r",4,null,a12); 23 fileTree a14=new fileTree("cop3530*",1,a6); 24 fileTree a15=new fileTree("cop3212*",1,a10); 25 fileTree a16=new fileTree("fall96*",1,a14); 26 fileTree a17=new fileTree("spr97*",1,null,a16); 27 fileTree a18=new fileTree("sum97*",1,null,a17); 28 fileTree a19=new fileTree("fall96*",1,a15); 29 fileTree a20=new fileTree("fall97*",1,null,a19); 30 fileTree a21=new fileTree("sy1.r",1,a16); 31 fileTree a22=new fileTree("sy1.r",5,a17); 32 fileTree a23=new fileTree("sy1.r",2,a18); 33 fileTree a24=new fileTree("grades",3,a19); 34 fileTree a25=new fileTree("prog1.r",4,null,a24); 35 fileTree a26=new fileTree("proge2.r",1,null,a25); 36 fileTree a27=new fileTree("proge2.r",2,a20); 37 fileTree a28=new fileTree("prog1.r",7,null,a27); 38 fileTree a29=new fileTree("grades",9,null,a28); 39 System.out.println("文件目录打印"); 40 printFilename(a2,0); 41 System.out.println("\n\n文件大小计算"); 42 calculateFileBlockSize(a1,0); 43 44 } 45 static void printFilename(fileTree A,int depth){ 46 if(A!=null){ 47 for(int i=0;i) 48 System.out.print("\t"); 49 System.out.println(A.fileName); 50 if(A.sonFile!=null) 51 { 52 printFilename(A.sonFile,depth+1); 53 fileTree temp=A.sonFile.brotherFile; 54 while(temp!=null){ 55 printFilename(temp,depth+1); 56 temp=temp.brotherFile; 57 } 58 } 59 } 60 } 61 static int calculateFileBlockSize(fileTree A,int depth){ 62 int totalSize=0; 63 if(A!=null){ 64 totalSize=A.fileSize; 65 if(A.sonFile!=null){ 66 totalSize+=calculateFileBlockSize(A.sonFile,depth+1); 67 fileTree temp=A.sonFile.brotherFile; 68 while(temp!=null) 69 { 70 totalSize+=calculateFileBlockSize(temp,depth+1); 71 temp=temp.brotherFile; 72 } 73 } 74 for(int i=0;i ) 75 System.out.print("\t"); 76 77 System.out.print(A.fileName+":"+totalSize); 78 System.out.println(); 79 } 80 return totalSize; 81 } 82 } 83 84 85 class fileTree{ 86 String fileName; //目录或者文件名 87 int fileSize; //目录或者文件的大小 88 fileTree sonFile; //子目录或者子文件的类 89 fileTree brotherFile; //同级目录或者文件的类 90 fileTree(String a,int size) 91 { 92 fileName=a; 93 fileSize=size; 94 } 95 fileTree(String a,int size,fileTree b) 96 { 97 fileName=a; 98 fileSize=size; 99 b.sonFile=this; 100 } 101 fileTree(String a,int size,fileTree b,fileTree c) 102 { 103 fileName=a; 104 fileSize=size; 105 if(b!=null){ 106 b.sonFile=this; 107 } 108 c.brotherFile=this; 109 } 110 }
(4)结果
a.打印文件目录
b.计算文件夹大小