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
投稿
猜你喜欢
- 如下所示:import java.util.ArrayList;//java中申请不定长度数组public class Test01 {pu
- 本文实例讲述了C#端口转发用法。分享给大家供大家参考。具体分析如下:这里以链接3389的时候为例例子1:连接a机器的3389端口连不上,因为
- 1、抽象类 vs 接口 方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态
- java 二叉查找树实例代码1.左边<中间<右边2.前序遍历 左中右3.中序遍历 中左右4.后序遍历 左右中public cla
- 标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者
- 上一篇介绍了使用springmvc集成shiro登陆过程,通过FormAuthenticationFilter过滤器获取到用户输入的账号密码
- 安装Free Mybatis plugin即可安装MyBatisCodeHelper插件(推荐)补充:IDEA插件(mybatis框架下ma
- 一、关键字关键字:被Java语言赋予特定含义的单词。组成关键字的字母全部小写。注:goto和const作为保留字存在,目前并不使用。main
- java jdbc连接和使用jdbc导入驱动//jar是已经打包好的class文件集,可以引用到其他工程中 //Build Pa
- mysql默认的隔离级别是repeatable_read根据spring文档,数据库一共有4个隔离级别read_uncommitread_c
- 本文实例讲述了Java基于Runtime调用外部程序出现阻塞的解决方法, 是一个很实用的技巧。分享给大家供大家参考。具体分析如下:有时候在j
- 这篇文章主要介绍了Spring自定义参数解析器代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 随着JDK 14的发布(https://waylau.com/jdk-14-released/),各大Java IDE也开始支持JDK 14
- 在上篇文章给大家介绍了IntelliJ IDEA设置显示内存指示器和设置内存大小的方法,感兴趣的朋友可以点击阅读,今天给大家分享IDEA 设
- Springcloud Config什么是springcloud Config  简单来说,Spring
- 本文实例为大家分享了java模拟进度计量器的具体代码,供大家参考,具体内容如下一、程序说明1、自定义模拟血压计外观图class M
- 背景以springboot为tomcat启动的框架,以angular2为前端页面的框架,最后需要将angular2的代码运行在springb
- 1: * 的定义: * 实际上是一个类,这个类实现了特定的接口,然后将这个类在 web.xml 文件中进行描述,这样服务器在启动的时候就可
- 1.概述我们之前讨论过Java Generics的基础知识。在本文中,我们将了解Java中的通用构造函数。 泛型构造函数是至少需要有一个泛型
- 1.用intellij idea 创建了一个springboot的项目,前期都运行的好好的,在ide中可以正常运行,但是打包成Jar运行却一