【原创】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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘