- 浏览: 3465687 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
import java.util.*; public class SortedBinTree<T extends Comparable> { static class Node { Object data; Node parent; Node left; Node right; public Node(Object data , Node parent , Node left , Node right) { this.data = data; this.parent = parent; this.left = left; this.right = right; } public String toString() { return "[data=" + data + "]"; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj.getClass() == Node.class) { Node target = (Node)obj; return data.equals(target.data) && left == target.left && right == target.right && parent == target.parent; } return false; } } private Node root; //两个构造器用于创建排序二叉树 public SortedBinTree() { root = null; } public SortedBinTree(T o) { root = new Node(o , null , null , null); } //添加节点 public void add(T ele) { //如果根节点为null if (root == null) { root = new Node(ele , null , null , null); } else { Node current = root; Node parent = null; int cmp = 0; //搜索合适的叶子节点,以该叶子节点为父节点添加新节点 do { parent = current; cmp = ele.compareTo(current.data); //如果新节点的值大于当前节点的值 if (cmp > 0) { //以右子节点作为当前节点 current = current.right; } //如果新节点的值小于当前节点的值 else { //以左子节点作为当前节点 current = current.left; } } while (current != null); //创建新节点 Node newNode = new Node(ele , parent , null , null); //如果新节点的值大于父节点的值 if (cmp > 0) { //新节点作为父节点的右子节点 parent.right = newNode; } //如果新节点的值小于父节点的值 else { //新节点作为父节点的左子节点 parent.left = newNode; } } } //删除节点,采用的是11. 25图的左边情形 public void remove(T ele) { //获取要删除的节点 Node target = getNode(ele); if (target == null) { return; } //左、右子树为空 if (target.left == null && target.right == null) { //被删除节点是根节点 if (target == root) { root = null; } else { //被删除节点是父节点的左子节点 if (target == target.parent.left) { //将target的父节点的left设为null target.parent.left = null; } else { //将target的父节点的right设为null target.parent.right = null; } target.parent = null; } } //左子树为空,右子树不为空 else if (target.left == null && target.right != null) { //被删除节点是根节点 if (target == root) { root = target.right; } else { //被删除节点是父节点的左子节点 if (target == target.parent.left) { //让target的父节点的left指向target的右子树 target.parent.left = target.right; } else { //让target的父节点的right指向target的右子树 target.parent.right = target.right; } //让target的右子树的parent指向target的parent target.right.parent = target.parent; } } //左子树不为空,右子树为空 else if(target.left != null && target.right == null) { //被删除节点是根节点 if (target == root) { root = target.left; } else { //被删除节点是父节点的左子节点 if (target == target.parent.left) { //让target的父节点的left指向target的左子树 target.parent.left = target.left; } else { //让target的父节点的right指向target的左子树 target.parent.right = target.left; } //让target的左子树的parent指向target的parent target.left.parent = target.parent; } } //左、右子树都不为空 else { //leftMaxNode用于保存target节点的左子树中值最大的节点 Node leftMaxNode = target.left; //搜索target节点的左子树中值最大的节点 while (leftMaxNode.right != null) { leftMaxNode = leftMaxNode.right; } //从原来的子树中删除leftMaxNode节点 leftMaxNode.parent.right = null; //让leftMaxNode的parent指向target的parent leftMaxNode.parent = target.parent; //被删除节点是父节点的左子节点 if (target == target.parent.left) { //让target的父节点的left指向leftMaxNode target.parent.left = leftMaxNode; } else { //让target的父节点的right指向leftMaxNode target.parent.right = leftMaxNode; } leftMaxNode.left = target.left; leftMaxNode.right = target.right; target.parent = target.left = target.right = null;//删除原来的节点 } } //根据给定的值搜索节点 public Node getNode(T ele) { //从根节点开始搜索 Node p = root; while (p != null) { int cmp = ele.compareTo(p.data); //如果搜索的值小于当前p节点的值 if (cmp < 0) { //向左子树搜索 p = p.left; } //如果搜索的值大于当前p节点的值 else if (cmp > 0) { //向右子树搜索 p = p.right; } else { return p; } } return null; } //广度优先遍历 public List<Node> breadthFirst() { Queue<Node> queue = new ArrayDeque<Node>(); List<Node> list = new ArrayList<Node>(); if( root != null) { //将根元素加入“队列” queue.offer(root); } while(!queue.isEmpty()) { //将该队列的“队尾”的元素添加到List中 list.add(queue.peek()); Node p = queue.poll(); //如果左子节点不为null,将它加入“队列” if(p.left != null) { queue.offer(p.left); } //如果右子节点不为null,将它加入“队列” if(p.right != null) { queue.offer(p.right); } } return list; } //实现中序遍历 public List<Node> inIterator() { return inIterator(root); } private List<Node> inIterator(Node node) { List<Node> list = new ArrayList<Node>(); //递归处理左子树 if (node.left != null) { list.addAll(inIterator(node.left)); } //处理根节点 list.add(node); //递归处理右子树 if (node.right != null) { list.addAll(inIterator(node.right)); } return list; } public static void main(String[] args) { SortedBinTree<Integer> tree = new SortedBinTree<Integer>(); //添加节点 tree.add(5); tree.add(20); tree.add(10); tree.add(3); tree.add(8); tree.add(15); tree.add(30); System.out.println(tree.breadthFirst()); //删除节点 tree.remove(20); System.out.println(tree.breadthFirst()); } }
发表评论
-
qweqwe
2012-07-11 16:06 1江蛤蟆 一统江湖 -
123123123
2012-07-11 16:04 0<p>法轮</p> -
母牛繁殖问题
2011-12-30 13:08 3893question:农场的母牛寿命是5年,母牛第二年和第四年会繁 ... -
树形显示
2011-07-17 11:26 1680/** 树形结构应用十分广泛。 下面这段代码根据 ... -
求能除尽1至n的最小整数
2011-07-16 02:43 4021为什么1小时有60分钟,而不是100分钟呢?这是历史上的 ... -
java 四则运算 栈的实现
2011-07-15 13:42 13899import java.util.Stack; /* ... -
用1、2、3、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列 要求:"4"不能在第三位,"3"与"5"不能相连。
2011-07-15 12:45 3418用1、2、3、3、4、5这六 ... -
【code】java红黑树
2011-06-28 10:07 3489import java.util.*; publi ... -
【code】java创建哈夫曼树和实现哈夫曼编码
2011-06-27 17:31 12930创建哈夫曼树 主要思想: (1)对List集合中所有节点进 ... -
【code】java实现十种常见内部排序
2011-06-20 19:22 3126常见的内部排序: 下面介绍这十种常见内部排序(都是从 ... -
【code】java二叉树深(先中后)、广遍历
2011-06-19 16:55 2000import java.util.*; publi ... -
【code】java二叉树的实现
2011-06-17 22:50 5909二叉树的顺序存储 public class Array ... -
【code】java树的实现
2011-06-17 22:20 12000树的父节点存储实现 import java.util. ... -
【code】java栈和队列实现
2011-06-16 22:11 4992顺序栈的实现 import java.util.Arrays ... -
【code】java线性表实现
2011-06-16 21:24 3707顺序线性表的实现 import java.util.A ...
相关推荐
这个名为"Java各种排序算法代码.zip"的压缩包包含了一系列实现不同排序算法的Java源代码。排序算法是计算机科学中的基本概念,用于对一组数据进行排列。下面将详细讨论这些算法及其在Java中的实现。 1. 冒泡排序...
3. pBinTreeStringWR.class 和 pBinTreeIntegerWR.class:这些可能表示基于字符串和整数的二叉树实现,可能用于搜索、插入和删除操作。"WR"可能是“Writeable”或类似含义,表示这些类支持对树数据结构的写入操作。 ...
堆排序是一种基于比较的排序算法,它利用了完全二叉树的特性,通过构建最大(或最小)堆来实现排序。在Java中,堆排序通常使用`PriorityQueue`类实现,具有O(n log n)的时间复杂度,但不稳定性较差。 接下来是归并...
`HuffmanCode.java`则负责生成Huffman编码,这通常通过遍历Huffman树并跟踪从根节点到每个叶子节点的路径来完成。每条路径可以被映射到一个唯一的二进制码,形成字符与编码的对应关系。 `CompressFrame.java`和`...
在Java中,实现堆排序通常涉及构建堆和进行排序两个主要步骤。 一、堆排序的基本原理 1. 建堆:首先将无序序列构建成一个大顶堆(升序时)或小顶堆(降序时)。对于大顶堆,根节点的值是整个堆中最大的,而小顶堆...
Java的java.util.PriorityQueue类实现了这个概念,可以用来实现堆排序等算法。 6. **堆(Heap)**:堆是一种特殊的树形数据结构,满足最大堆或最小堆的性质,即父节点的值总是大于或小于其子节点的值。Java的java....
本资源包"算法实践(JavaScript & Java),排序,查找、树、两指针、动态规划等"涵盖了编程中的多个重要概念,旨在帮助开发者提升算法设计与实现能力。接下来,我们将详细探讨这些知识点。 1. **动态规划**: 动态...
本资源“Java_Programming_classic_tree_parameter_code.rar”包含了一个名为“Java编程开发树参数经典代码.java”的文件,它很可能包含了实现树结构及其操作的示例代码。下面我们将深入探讨树数据结构的基本概念、...
Java版的赫夫曼编码计算程序是一个用于数据压缩的实用工具,它基于赫夫曼树(也称为最优二叉树)...通过阅读和分析`HuffmanCode.java`的源代码,我们可以学习到如何在Java中实现这些概念,并进一步提升我们的编程能力。
在Java中实现哈夫曼编码,首先需要理解面向对象的思想。面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性,它将数据和操作数据的方法封装在一起,形成对象。在哈夫曼编码的实现中,我们可以创建三...
例如,链表操作可以用于实现LRU缓存,二叉树可以用于搜索和排序问题。 算法是解决问题的有效工具,面试中经常涉及排序(快速排序、归并排序、堆排序等)、查找(线性查找、二分查找)、动态规划、贪心算法、回溯法...
二叉树是每个节点最多有两个子节点的数据结构,广泛应用于搜索和排序。红黑树是一种自平衡的二叉查找树,确保插入和删除操作的时间复杂度为O(log n)。 "ch09 Code"和"ch11 Code"可能包含散列表(HashMap)的实现和...
- **堆排序(Heap Sort)**: 堆排序是一种基于比较的排序算法,其核心是利用完全二叉树(堆)的性质来进行排序。在示例代码中,使用了最小堆(min heap)对节点进行了排序,以便构建哈夫曼树。 - **构建最小堆**: ...
"Code for binary tree"这个压缩包可能包含了用不同编程语言实现的二叉树操作代码,比如插入、删除、搜索和遍历等操作。常见的编程语言如C++、Java、Python等都有相应的二叉树数据结构实现。通过阅读和理解这些代码...
`Tree`相关文件(如`TestTreeIterators.java`)可能涉及二叉树、平衡树(如AVL树或红黑树)等,它们在搜索、排序和其他操作中非常高效。 2. **问题分析**:这是理解算法复杂性和性能的过程。`Sort.java`可能是对...
这个压缩包文件“Java-data-structure-source-code”很可能包含了一些经典的Java实现的数据结构,如数组、链表、栈、队列、树、图等。下面将详细介绍这些常见的数据结构以及它们在Java中的实现。 1. **数组**:数组...
"codelibrary_main.zip"这个名字暗示了一个代码库,可能包含了各种算法和数据结构的Java实现。这个子压缩包可能包含分门别类的目录,每个目录对应一种或多种算法或数据结构,如排序算法(快速排序、归并排序、冒泡...
在"Algorithm-codelibrary.zip"中,你可以找到各种经典算法的实现,如搜索算法(二分查找、广度优先搜索、深度优先搜索)、排序算法(冒泡排序、快速排序、归并排序)以及图算法(Dijkstra算法、Floyd-Warshall算法...
Java算法大全源码包是一个集合了多种经典算法实现的资源包,主要面向Java开发者,旨在帮助他们提升在算法设计和实现方面的技能。这个资源包很可能包含了各种数据结构、排序算法、搜索算法以及其他实用的编程技巧。...