【原创】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

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2