软件编程
位置:首页>> 软件编程>> java编程>> Java的二叉树排序以及遍历文件展示文本格式的文件树

Java的二叉树排序以及遍历文件展示文本格式的文件树

作者:sunxing007  发布时间:2021-08-04 07:13:43 

标签:Java,二叉树

Java二叉树排序算法
排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的:
排序二叉树的3个特征:
1:当前node的所有左孩子的值都小于当前node的值;
2:当前node的所有右孩子的值都大于当前node的值;
3:孩子节点也满足以上两点


package test.sort;

public class BinaryNode {
private int value;//current value
private BinaryNode lChild;//left child
private BinaryNode rChild;//right child

public BinaryNode(int value, BinaryNode l, BinaryNode r){
 this.value = value;
 this.lChild = l;
 this.rChild = r;
}

public BinaryNode getLChild() {
 return lChild;
}
public void setLChild(BinaryNode child) {
 lChild = child;
}
public BinaryNode getRChild() {
 return rChild;
}
public void setRChild(BinaryNode child) {
 rChild = child;
}
public int getValue() {
 return value;
}
public void setValue(int value) {
 this.value = value;
}

//iterate all node.
public static void iterate(BinaryNode root){
 if(root.lChild!=null){
  iterate(root.getLChild());
 }
 System.out.print(root.getValue() + " ");
 if(root.rChild!=null){
  iterate(root.getRChild());
 }
}

/**
 * add child to the current node to construct a tree.
 * Time: O( nlog(n) )
 * **/
public void addChild(int n){
 if(n<value){
  if(lChild!=null){
   lChild.addChild(n);
  }
  else{
   lChild = new BinaryNode(n, null, null);
  }
 }
 else{
  if(rChild!=null){
   rChild.addChild(n);
  }
  else{
   rChild = new BinaryNode(n, null, null);
  }
 }
}

//test case.
public static void main(String[] args){
 System.out.println();
 int[] arr = new int[]{23,54,1,65,9,3,100};
 BinaryNode root = new BinaryNode(arr[0], null, null);
 for(int i=1; i<arr.length; i++){
  root.addChild(arr[i]);
 }
 BinaryNode.iterate(root);
}
}

Java遍历文件展示文本格式的文件树
用java写一个代码变历文件树,打印出结构,类似在cmd输入命令tree的结果。
本来觉得很简单,做的时候才知道有点难。要是感兴趣, 你也可以试试。


package test.io;
//在网上找的,听说还是老字竹原创。代码简洁,但是我费了好大的功副消化
import java.util.ArrayList;
import java.util.List;
public class Folder {
public Folder(String title) {
 this.title = title;
}
private String title;
private List<Folder> children = new ArrayList<Folder>();
public void addChild(Folder f) {
 children.add(f);
}
public List<Folder> getChildren() {
 return children;
}
public void setChildren(List<Folder> children) {
 this.children = children;
}
public String getTitle() {
 return title;
}
public void setTitle(String title) {
 this.title = title;
}
public String toString(String lftStr, String append) {
 StringBuilder b = new StringBuilder();
 b.append(append + title);
 b.append("/n");
 if (children.size() > 0) {
  for (int i = 0; i < children.size() - 1; i++) {
   b.append(lftStr+ children.get(i).toString(lftStr + "│ ",
"├-"));
  }
  b.append(lftStr+ children.get(children.size() - 1).toString(lftStr +
" ","└-"));
 }
 return b.toString();
}
public static void main(String[] args) {
 Folder root = new Folder("菜单列表");
 Folder f1 = new Folder("开始菜单");
 root.addChild(f1);
 Folder f1_1 = new Folder("程序");
 f1.addChild(f1_1);
 Folder f1_1_1 = new Folder("附件");
 f1_1.addChild(f1_1_1);
 Folder f1_1_1_1 = new Folder("娱乐");
 f1_1_1.addChild(f1_1_1_1);
 Folder f1_1_1_2 = new Folder("娱乐2");
 f1_1_1.addChild(f1_1_1_2);
 Folder f1_2 = new Folder("辅助工具");
 f1.addChild(f1_2);
 System.out.println(root.toString(" ", "$"));
}
}
//**************************************
//经过消化之后我修改的。可打印文件结构
import java.io.*;
public class DocTree {
File root = null;

public DocTree(File f){
 this.root = f;
}

public static void main(String[] args){
 File root = new File("c://test");
 DocTree tree = new DocTree(root);
 System.out.println(tree.toString(" ", ""));
}

public String toString(String leftStr, String append){
 StringBuilder b = new StringBuilder();
 b.append(append + root.getName());
 b.append("/n");
 if(!root.isFile()&&root.listFiles().length!=0){
  File[] files = root.listFiles();
  DocTree[] docTrees = new DocTree[files.length];
  for(int i=0; i<docTrees.length; i++){
   docTrees[i] = new DocTree(files[i]);
  }
  for (int i=0; i<files.length-1; i++){
   b.append(leftStr + docTrees[i].toString(leftStr+"│", "├"));
  }
  b.append(leftStr + docTrees[docTrees.length-1].toString(leftStr + " ", "└"));
 }
 return b.toString();
}
}
//*****************************************
//然后我还是觉得理解起来不方便, 过几天说不定就忘记了,
//还是自己写一个, 虽然思想照抄, 但我觉得自己的理解起来很方便。
//带注释,
import java.io.*;
public class Tree {
File root = null;
public Tree(File f){
 this.root = f;
}
/**
test
├1
│├目录1.txt
│├目录11
││├111.txt
││└112.txt
│└12
└test.pdf
 */
/**
 * @param root 当前正在被扫描的根文件
 * @param childLeftStr 如果该文件有孩子,childLeftStr
 *  表示孩子节点的左面应该打印出来的结构性信息
 *  拿上面的例子来说,根结点test的孩子的左面的
 *  结构信息为"" 空,结点"目录11"的孩子的结构信息为"││",
 * @param junction 结点图标,如果是该结点是它父亲的最后一个结点,
 *  则为"└",否则为"├".
 */

public void showTree(File root, String childLeftStr, String junction){
 //打印结点的信息
 System.out.println(junction + root.getName());
 //如果有孩子, 而且孩子的数目不为0
 if(!root.isFile()&&root.listFiles().length!=0){
  File[] files = root.listFiles();
  //构造孩子结点
  Tree[] children = new Tree[files.length];
  for(int i=0; i<files.length; i++){
   children[i] = new Tree(files[i]);
  }
  //打印孩子结点
  for(int i=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+" ","└");
 }
}
public static void main(String[] args) {
 File f = new File("C://test");
 Tree t = new Tree(f);
 t.showTree(f,"", "");
}
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com