[数据结构与算法分析:C语言描述读书笔记]树

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<depth;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<depth;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.计算文件夹大小

 

转载于:https://www.cnblogs.com/guidepost/p/7000896.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值