- 博客(15)
- 收藏
- 关注
原创 二叉树遍历与删除
前面写过二叉树的节点插入与查找关键数据项以及最值的数据项。二叉树的删除与遍历是另外一项重要的操作。特别是二叉树的人删除比较复杂,分为无子节点的节点删除,只有一个子节点的节点删除和有两个子节点的节点删除三种情况。1. 删除没有子节点的节点 这种情况是三种节点删除中最简单的。因为没有子节点的节点删除时只需要将该节点的左或者右节点的引用置为null即可。其他的基本不用变。可以下图表示:原始二叉树
2016-09-20 23:18:31 9057 1
原创 二叉树
二叉树的优势 在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。二叉树的构成 二叉树由节点(node)和边组成。节点
2016-09-19 23:09:36 51134 10
原创 基数排序
基数排序是一种与之前几种排序不同的排序方法,之前的排序是基于关键字排序算法。基数排序属于分配式排序,而且基数排序是稳定排序。以下是基数排序的步骤:假设在一个数组为例,数据中的数据项均小于1000(位数最多是三维)。1 先对数组中所有的数据项个位进行排序,个位数字0~9,从小到大的顺序进行存放(不比较其他位数字大小),结果存放在一个缓存二维数组里面。2 在步骤1的基础之上继续对数据项的十位进行排序(数
2016-09-17 19:18:36 681
原创 快速排序
快速排序是一种常见的排序算法,大多数情况下快速排序都是最快的。快速排序本质上是将一个数组划分一个子数组(关于划分前面已经说过),递归调用自身为每一个子数组进行快速排序。 快速排序的过程:以数组为例,针对数组进行排序。1 把数组或者子数组划分为左边(比关键字小的)一组和右边比关键字大的一组。2 调用自身对左边一组进行排序。3 再次调用自身对右边的一组进行排序。4 不断递归循环以上步骤,子数
2016-09-16 22:20:26 560
原创 划分
接触快速排序之前首先需要了解划分。划分就是将数据划分为两组,比关键字大的划分在一组,比关键字小的划分在另外一组。 划分算法可以理解是两个指针操作的进程。开始时指针分别指向数组头部和尾部(以数组为例,通常数组是没有头部和尾部所谓的,这里是简单描述这个问题),操作的过程是以下几个流程:1 初始化leftPtr(向右检索的指针)在数组最左端,rightPtr指针在数组最右端。2 leftPtr
2016-09-15 15:42:03 494
原创 希尔排序
前面说过插入排序,插入排序是三种基本排序中较快的一种,效率最低的是冒泡排序,因为冒泡排序需要反复比较。对于插入排序虽然较快,不过比较复制次数比较多。希尔排序是在插入排序的基础上进行改进,排序速度比插入排序要快。 希尔排序是通过缩小插入排序中的元素之间的间隔,假设是对数组进行排序,可以认为希尔排序首先将对数组进行划分子数组,对每个数组进行插入排序。子数组的划分依据是每个一定的长度h。通过缩短
2016-09-10 18:21:52 795
原创 归并排序
归并排序是一种效率较高的排序,与之前说到的三种基本排序:冒泡排序、选择排序、插入排序速度要快。归并排序核心是将归并两个有序的数组,并使它们有序的排列在数组C中。假设有两个有序数组,不要求大小长度一致,假设数组有4个数组项,数组B有6个数据项,需要将他们归并到一个数组C中,以下是归并过程。归并之后的数组C以下是将数组A和数组B归并为数组C的代码:(前提是数组A与B有序)//采用常规思维解决归并排序问题
2016-09-09 21:55:13 359
原创 求解汉诺塔问题
汉诺塔是经典问题。具体表述为:由很多放置在三个塔座上的盘子组成的一个古老难题,所有盘子直径都是不同的,盘子中央都有一个洞使他们刚好可以放在塔座上。所有的盘子刚开始放在塔座A上面,这个难题的目标是将所有的盘子都从塔座A上移动到塔座C上,每一次只能移动一个盘子,并且任何一个盘子都不可以放在比自己小的盘子之上。如下图所示: 以三个盘子为例,如果以手工进行试验需要移动7次,先后顺序是:Disk
2016-09-08 22:14:27 576
原创 递归——单词全排列
递归是编程技术中常用的一种技术,就是方法是支持自己调用自己,在面对过程编程中已经有了递归的接触,像斐波那契序列的求解等这些都是可以用递归来解决的。java方法是支持嵌套调用方法不支持嵌套定义。 使用递归需要注意以下几点:1 递归需要一个基值情况,其意思是导致递归的返回而没有再一次递归调用。2 第一个递归都需要有终止条件。以防止无限递归下去,可能由此引发程序崩溃。以上两点是在递归调用中特
2016-09-08 19:21:13 1908
原创 链表与迭代器
链表的使用中find操作是常见的,很多时候也需要对链表进行遍历。如果使用迭代器遍历每一个对象,这样就会使数据结构与遍历对象(迭代器)区分开,java中的Iterator作为轻量级对象,创建代价比较小。至少在使用迭代器可以有一下几点好处: 1 迭代器可以提供统一的迭代方式,也就是说对于链表、队列、数组、叉树都可以使用迭代器来时实现迭代。 2 迭代器可以在客户端透明的情况下提供各种不同的
2016-09-07 19:14:19 3933
原创 双向链表
前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。 考虑一下下面这个情况:如果文本编辑器用链表来存储文本,当用户向下移动光标时,程序移动到下一个链结点操作新一行,假设链表每个结点存放的是一行字符串。光标向下移动前面所说的几种链表结构已经实现了。但是光标上移就显得复杂,至少在不使用双向链表的前提下没那么向下移
2016-09-06 21:40:21 808
原创 有序链表
链表中有时候需要对数据的顺序有所要求,对于一些应用来说链表中保持数据有序是有意义的一件事,下面就围绕有序链表,说明有序链表的创建和利用链表实现排序。 在有序链表插入一个数据项,可以采用之前的插入排序的思想,通过局部有序实现数据的排序。插入数据通常在链表中有三种方式:在链表头部、尾部、中间。这三种方式需要考虑到。有序链表的创建过程 和一般链表创建一样,首先创建一个结点node,包
2016-09-05 22:44:46 778
原创 双端链表
双端链表与传统的链表很相似,在基本链表的基础上新增一个特性:对最后一个结点的引用。如下图所示: 与之前说到的链表相比还有一个功能是在表尾直接插入一个链结点,这样就不用普通链表一样通过遍历链表到尾部进行添加数据项了。 双端链表的操作与单链表操作区别除了可以从头部插入数据和删除数据、查找数据以及实现关键数据项的删除等,还可以实现从链表尾部添加数据。以下是代码:class Link1{
2016-09-04 13:30:40 1302
原创 数据结构——单链表
链表也是一种常用的数据结构,机制灵活用途广泛,适用于许多通用数据库。讨论一下数组的使用缺陷:1.无序数组搜索效率比较低,有序数组插入效率比较低。无论哪一种删除效率都很低。2。数组大小一旦创建了就不能改变该数组的大小了。链表相对于数组这些缺陷都有一定的改善。链结点通常每个对象中都包含一个对下一个链结点的引用。如下图所示:关于自引用 在定义链表基本结构时会用到自引用,这是建立链表的重要环节。
2016-09-03 21:13:14 596
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人