【原创】Java与数据结构(中篇:树)
来源:互联网 发布:php数组按id排序 编辑:程序博客网 时间:2024/06/05 16:25
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与数据结构(中篇:树)
- 【原创】Java与数据结构(下篇:图)
- java数据结构--二叉树与查找树
- Java数据结构与算法:二叉树
- Java数据结构与算法---二叉树
- java数据结构与算法-二叉树
- Java数据结构与算法解析---AVL树
- Java与数据结构(五) 二叉树
- Java数组与数据结构
- Java集合与数据结构
- java与数据结构
- java数据结构与算法
- Java数据结构与算法
- 《JAVA数据结构与算法》
- Java集合与数据结构
- Redis与Java - 数据结构
- Java与数据结构
- java 数据结构与算法
- QT显示图片
- IE6中PNG透明背景图片处理方法
- ios知识整理
- 当你对未来迷茫的时候请看看
- 程序员应该多问些为什么
- 【原创】Java与数据结构(中篇:树)
- java Map的遍历
- 一个有趣的问题:关于Java中的Integer
- HDU H204 阿牛的EOF牛肉串
- html标签默认样式
- C++读写文件并排序
- spring3.2 mvc web.xml
- 16-循环控制
- linux 下串口命令