Java的二叉树排序以及遍历文件展示文本格式的文件树
Java二叉树排序算法
排序二叉树的描述也是一个递归的描述,所以排序二叉树的构造自然也用递归的:
排序二叉树的3个特征:
1:当前node的所有左孩子的值都小于当前node的值;
2:当前node的所有右孩子的值都大于当前node的值;
3:孩子节点也满足以上两点
packagetest.sort; publicclassBinaryNode{ privateintvalue;//currentvalue privateBinaryNodelChild;//leftchild privateBinaryNoderChild;//rightchild publicBinaryNode(intvalue,BinaryNodel,BinaryNoder){ this.value=value; this.lChild=l; this.rChild=r; } publicBinaryNodegetLChild(){ returnlChild; } publicvoidsetLChild(BinaryNodechild){ lChild=child; } publicBinaryNodegetRChild(){ returnrChild; } publicvoidsetRChild(BinaryNodechild){ rChild=child; } publicintgetValue(){ returnvalue; } publicvoidsetValue(intvalue){ this.value=value; } //iterateallnode. publicstaticvoiditerate(BinaryNoderoot){ if(root.lChild!=null){ iterate(root.getLChild()); } System.out.print(root.getValue()+""); if(root.rChild!=null){ iterate(root.getRChild()); } } /** *addchildtothecurrentnodetoconstructatree. *Time:O(nlog(n)) ***/ publicvoidaddChild(intn){ if(n<value){ if(lChild!=null){ lChild.addChild(n); } else{ lChild=newBinaryNode(n,null,null); } } else{ if(rChild!=null){ rChild.addChild(n); } else{ rChild=newBinaryNode(n,null,null); } } } //testcase. publicstaticvoidmain(String[]args){ System.out.println(); int[]arr=newint[]{23,54,1,65,9,3,100}; BinaryNoderoot=newBinaryNode(arr[0],null,null); for(inti=1;i<arr.length;i++){ root.addChild(arr[i]); } BinaryNode.iterate(root); } }
Java遍历文件展示文本格式的文件树
用java写一个代码变历文件树,打印出结构,类似在cmd输入命令tree的结果。
本来觉得很简单,做的时候才知道有点难。要是感兴趣,你也可以试试。
packagetest.io; //在网上找的,听说还是老字竹原创。代码简洁,但是我费了好大的功副消化 importjava.util.ArrayList; importjava.util.List; publicclassFolder{ publicFolder(Stringtitle){ this.title=title; } privateStringtitle; privateList<Folder>children=newArrayList<Folder>(); publicvoidaddChild(Folderf){ children.add(f); } publicList<Folder>getChildren(){ returnchildren; } publicvoidsetChildren(List<Folder>children){ this.children=children; } publicStringgetTitle(){ returntitle; } publicvoidsetTitle(Stringtitle){ this.title=title; } publicStringtoString(StringlftStr,Stringappend){ StringBuilderb=newStringBuilder(); b.append(append+title); b.append("/n"); if(children.size()>0){ for(inti=0;i<children.size()-1;i++){ b.append(lftStr+children.get(i).toString(lftStr+"│", "├-")); } b.append(lftStr+children.get(children.size()-1).toString(lftStr+ "","└-")); } returnb.toString(); } publicstaticvoidmain(String[]args){ Folderroot=newFolder("菜单列表"); Folderf1=newFolder("开始菜单"); root.addChild(f1); Folderf1_1=newFolder("程序"); f1.addChild(f1_1); Folderf1_1_1=newFolder("附件"); f1_1.addChild(f1_1_1); Folderf1_1_1_1=newFolder("娱乐"); f1_1_1.addChild(f1_1_1_1); Folderf1_1_1_2=newFolder("娱乐2"); f1_1_1.addChild(f1_1_1_2); Folderf1_2=newFolder("辅助工具"); f1.addChild(f1_2); System.out.println(root.toString("","$")); } } //************************************** //经过消化之后我修改的。可打印文件结构 importjava.io.*; publicclassDocTree{ Fileroot=null; publicDocTree(Filef){ this.root=f; } publicstaticvoidmain(String[]args){ Fileroot=newFile("c://test"); DocTreetree=newDocTree(root); System.out.println(tree.toString("","")); } publicStringtoString(StringleftStr,Stringappend){ StringBuilderb=newStringBuilder(); b.append(append+root.getName()); b.append("/n"); if(!root.isFile()&&root.listFiles().length!=0){ File[]files=root.listFiles(); DocTree[]docTrees=newDocTree[files.length]; for(inti=0;i<docTrees.length;i++){ docTrees[i]=newDocTree(files[i]); } for(inti=0;i<files.length-1;i++){ b.append(leftStr+docTrees[i].toString(leftStr+"│","├")); } b.append(leftStr+docTrees[docTrees.length-1].toString(leftStr+"","└")); } returnb.toString(); } } //***************************************** //然后我还是觉得理解起来不方便,过几天说不定就忘记了, //还是自己写一个,虽然思想照抄,但我觉得自己的理解起来很方便。 //带注释, importjava.io.*; publicclassTree{ Fileroot=null; publicTree(Filef){ this.root=f; } /** test ├1 │├目录1.txt │├目录11 ││├111.txt ││└112.txt │└12 └test.pdf */ /** *@paramroot当前正在被扫描的根文件 *@paramchildLeftStr如果该文件有孩子,childLeftStr *表示孩子节点的左面应该打印出来的结构性信息 *拿上面的例子来说,根结点test的孩子的左面的 *结构信息为""空,结点"目录11"的孩子的结构信息为"││", *@paramjunction结点图标,如果是该结点是它父亲的最后一个结点, *则为"└",否则为"├". */ publicvoidshowTree(Fileroot,StringchildLeftStr,Stringjunction){ //打印结点的信息 System.out.println(junction+root.getName()); //如果有孩子,而且孩子的数目不为0 if(!root.isFile()&&root.listFiles().length!=0){ File[]files=root.listFiles(); //构造孩子结点 Tree[]children=newTree[files.length]; for(inti=0;i<files.length;i++){ children[i]=newTree(files[i]); } //打印孩子结点 for(inti=0;i<children.length-1;i++){ //对所有的孩子结点,先打印出左边的结构信息, System.out.print(childLeftStr); //递归调用showTree,注意参数有所变化,文件加的深度增加的时候 ,它的孩子的结构信息也会 //增加,如果不是最后一个孩子,则结构信息需加上"│"。 showTree(children[i].root,childLeftStr+"│","├"); } //最后一个孩子需要特殊处理 //打印结构信息 System.out.print(childLeftStr); //如果是最后一个孩子,则结构信息需加上""。 //结点形状也调整为"└" showTree(children[files.length-1].root,childLeftStr+"","└"); } } publicstaticvoidmain(String[]args){ Filef=newFile("C://test"); Treet=newTree(f); t.showTree(f,"",""); } }