【原创】Java与数据结构(中篇:树)

2024-05-30 19:32

本文主要是介绍【原创】Java与数据结构(中篇:树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 1. 二叉树 遍历算法

复制代码
package tree;
import java.util.ArrayDeque;
import java.util.Queue;
/**
* 二叉树的四种遍历方式<br>
* 先序,中序,后序,广度优先遍历
* 
* @author yinger
*/
public class IteratorAlgorithm {
public static void main(String[] args) {
TreeNode root = new TreeNode("0");
TreeNode node1 = new TreeNode("1");
TreeNode node2 = new TreeNode("2");
root.left = node1;
root.right = node2;
TreeNode node3 = new TreeNode("3");
TreeNode node4 = new TreeNode("4");
node1.left = node3;
node1.right = node4;
TreeNode node5 = new TreeNode("5");
TreeNode node6 = new TreeNode("6");
node2.left = node5;
node2.right = node6;
TreeNode node7 = new TreeNode("7");
TreeNode node8 = new TreeNode("8");
node3.left = node7;
node4.right = node8;
System.out.print("PreIterator: ");
root.preIterator();// PreIterator: 0 1 3 7 4 8 2 5 6
        System.out.println();
System.out.print("InIterator: ");
root.inIterator();// InIterator: 7 3 1 4 8 0 5 2 6
        System.out.println();
System.out.print("PostIterator: ");
root.postIterator();// PostIterator: 7 3 8 4 1 5 6 2 0
        System.out.println();
System.out.print("WideIterator: ");
root.wideIterator();// WideIterator: 0 1 2 3 4 5 6 7 8
    }
}
class TreeNode {
Object data;
TreeNode left;
TreeNode right;
public TreeNode(Object data) {
this.data = data;
}
// preIterator
public void preIterator() {
visit(this);
if (left != null) {
left.preIterator();
}
if (right != null) {
right.preIterator();
}
}
// inIterator
public void inIterator() {
if (left != null) {
left.inIterator();
}
visit(this);
if (right != null) {
right.inIterator();
}
}
// postIterator
public void postIterator() {
if (left != null) {
left.postIterator();
}
if (right != null) {
right.postIterator();
}
visit(this);
}
// wideIterator
public void wideIterator() {
// ArrayDeque:faster than stack (when used as a stack) and linkedlist(when used as a queue)
Queue<TreeNode> deque = new ArrayDeque<TreeNode>();
deque.add(this);
TreeNode node;
while ((node = deque.poll()) != null) {
visit(node);
if (node.left != null) {
deque.add(node.left);
}
if (node.right != null) {
deque.add(node.right);
}
}
}
// visit function
private void visit(TreeNode treeNode) {
if (treeNode != null) {
System.out.print(treeNode.data + "  ");
}
}
}
复制代码

 

2. 哈夫曼树 这次我用的是插入排序,两次删除一次插入,以前用的是和最小堆结合,原理差不多,其实也可以使用快排

复制代码
package tree;
import java.util.ArrayDeque;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 哈夫曼树
* 
* @author yinger
*/
public class HuffmanTree {
public static void main(String[] args) {
HuffmanTreeNode root = new HuffmanTreeNode("root", 0.5);
HuffmanTreeNode node1 = new HuffmanTreeNode("node1", 1.0);
HuffmanTreeNode node2 = new HuffmanTreeNode("node2", 2.0);
HuffmanTreeNode node3 = new HuffmanTreeNode("node3", 3.0);
HuffmanTreeNode node4 = new HuffmanTreeNode("node4", 3.5);
LinkedList<HuffmanTreeNode> nodes = new LinkedList<HuffmanTreeNode>();
Collections.addAll(nodes, root, node1, node2, node3, node4);
HuffmanTree huffmanTree = new HuffmanTree();
HuffmanTreeNode treeRoot = huffmanTree.createHuffmanTree(nodes);
treeRoot.wideIterator();
}
public HuffmanTreeNode createHuffmanTree(LinkedList<HuffmanTreeNode> nodes) {// create huffmantree
insertSort(nodes, 0, nodes.size() - 1);// sort nodes using insrt sort
while (nodes.size() > 1) {
HuffmanTreeNode left = nodes.pollFirst();// remove the two smallest
HuffmanTreeNode right = nodes.pollFirst();
HuffmanTreeNode parent = new HuffmanTreeNode(left.data + "+" + right.data, left.weight + right.weight);
parent.left = left;
parent.right = right;
insertNode(nodes, parent);
}// end while,nodes.size = 1 --> the root node
return nodes.peek();
}
// insert new node into nodes,and make it sorted!
private void insertNode(LinkedList<HuffmanTreeNode> nodes, HuffmanTreeNode parent) {
nodes.addLast(parent);// first add it,make size++,then sort it!
//        System.out.println("Befor: insert new node:");
//        for (HuffmanTreeNode huffmanTreeNode : nodes) {
//            System.out.print(huffmanTreeNode.weight + "  ");
//        }
//        System.out.println();
int j, low, high, mid, size = nodes.size();
low = 0;
high = size - 2;// attention:the last node is not included!
while (low <= high) {// final position is low
mid = (low + high) / 2;
if (nodes.get(mid).weight > parent.weight) {
high = mid - 1;
} else {
low = mid + 1;
}
}
for (j = size - 1; j > low; j--) {// move back some elements
nodes.set(j, nodes.get(j - 1));
}
nodes.set(low, parent);
//        System.out.println("After: insert new node:" + "  low=" + low);
//        for (HuffmanTreeNode huffmanTreeNode : nodes) {
//            System.out.print(huffmanTreeNode.weight + "  ");
//        }
//        System.out.println();
    }
private void insertSort(List<HuffmanTreeNode> nodes, int start, int end) {// half find insert sort
int i, j, size = nodes.size();
int low, high, mid;
HuffmanTreeNode tempNode;
for (i = 1; i < size; i++) {// 0 - (i-1) has been sorted,now insert i
low = 0;
high = i - 1;
tempNode = nodes.get(i);
while (low <= high) {// final right position is low
mid = (low + high) / 2;
if (nodes.get(mid).weight > tempNode.weight) {
high = mid - 1;
} else {
low = mid + 1;
}
}
for (j = i; j > low; j--) {// move back some elements
nodes.set(j, nodes.get(j - 1));
}
nodes.set(low, tempNode);
}
//        System.out.println("After insertsort:");
//        for (HuffmanTreeNode huffmanTreeNode : nodes) {
//            System.out.print(huffmanTreeNode.weight + "  ");
//        }
//        System.out.println();
    }
}
class HuffmanTreeNode {
String data;// define data is string
double weight;// weight of the node
    HuffmanTreeNode left;
HuffmanTreeNode right;
public HuffmanTreeNode(String data, double weight) {
this.data = data;
this.weight = weight;
}
// wideIterator
public void wideIterator() {
// ArrayDeque:faster than stack (when used as a stack) and linkedlist(when used as a queue)
Queue<HuffmanTreeNode> deque = new ArrayDeque<HuffmanTreeNode>();
deque.add(this);
HuffmanTreeNode node;
while ((node = deque.poll()) != null) {
visit(node);
if (node.left != null) {
deque.add(node.left);
}
if (node.right != null) {
deque.add(node.right);
}
}
}
// visit function
private void visit(HuffmanTreeNode node) {
if (node != null) {
System.out.println(node.data + "  " + node.weight + "  ");
}
}
}
复制代码

 

其他数据结构内容请看下篇。 谢谢阅读,如果发现错误,请及时回复我!

这篇关于【原创】Java与数据结构(中篇:树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016771

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏