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,"","");
}
}