![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
liuhe688
这个作者很懒,什么都没留下…
展开
-
数据结构与算法简记:AVL树
前面记录了二叉查找树,它在搜索方面的效率显而易见,可它也存在某种缺陷,假设我们连续插入较小或较大的数据,那么二叉查找树将会逐渐退变为一个线性结构,从而搜索就变为了线性查找,效率将会大打折扣。所以,我们需要一棵这样的树,它在插入新节点后,能够重新调整自己的结构,使左右恢复平衡。AVL树就符合这个条件。AVL树是最先发明的自平衡二叉查找树,其得名于它的发明者 G.M. Adelson-Velsky 和原创 2016-08-10 16:50:49 · 3138 阅读 · 2 评论 -
数据结构与算法简记:二叉查找树相关操作
二叉查找树(Binary Search Tree)又称或二叉搜索树或二叉排序树,它满足下面的条件:1. 如果左子树不为空,则左子树上的所有节点值都小于根节点2. 如果右子树不为空,则右子树上的所有节点值都大于根节点3. 所有子树都遵循以上规则所以二叉查找树从整体看来,是按中序序列从小到大排序的一棵二叉树,如下图所示:二叉查找树有常用的几个基本操作,包括:向树中插入一个指定值的节点,查找原创 2016-08-03 13:10:43 · 2539 阅读 · 0 评论 -
数据结构与算法简记:线索化二叉树
二叉树是一个复杂的非线性结构,所以在遍历结点时,一个结点只能获取左右子结点,不能直接获取遍历序列中的后继结点,这显然不太方便。线索化二叉树就可以很好的解决这个问题,将遍历中的前驱和后继结点串联起来,让我们在遍历二叉树时,像线性表一样方便快捷。今天就来记录一下:中序线索化二叉树和遍历线索二叉树。对上图的二叉树进行中序线索化,思路如下:由于中序遍历的特点,要想访问A结点,首先要访问B结点,然后递归的方原创 2016-07-29 13:00:35 · 2064 阅读 · 0 评论 -
数据结构与算法简记:按层次顺序遍历和存储二叉树
前面曾经记录过,给出一个按层次顺序排放的存储数据,进而可以构建出一棵二叉树,今天就来简单记录一下,如何按层次顺序遍历二叉树,最后又如何根据二叉树生成层次存储数据,对于满二叉树来讲这十分必要。对与这棵二叉树来说,它的层次遍历顺序和层次存储顺序分别为: A B E C D F A B E C D # F按层次遍历思路:首先将根节点放入队列。取出队首元素并访问该节点,然后探索其左子树,如果原创 2016-07-22 13:53:01 · 6605 阅读 · 0 评论 -
数据结构与算法简记:非递归遍历二叉树
前几次在创建二叉树时也顺带写了几个二叉树遍历的方法,包括前序、中序和后序遍历,都是递归的方法,今天就记录几个对应的非递归方式。还是这个二叉树,我们需要使用栈结构对其进行非递归方式的前序、中序和后序遍历。前序思路:在遍历一颗子树时,首先访问其根节点,然后将其入栈,接着继续探索其左子树,如果左子树不为空,则访问左子树根节点,同样将其入栈,如此进行下去,直到二叉树根节点左边部分的子树根原创 2016-07-21 13:40:42 · 1391 阅读 · 0 评论 -
数据结构与算法简记:根据层次顺序存储结构构建二叉树---改进版
上次记录了如何根据二叉树层次顺序存储结构来构建一颗二叉树,其思路是求出每一层的节点个数,然后根据当前节点层的指针遍历每个节点,并与父层节点指针指向的节点建立关联,逐层进行。不过这种思路显得不够开阔,算法不够精简,代码也有些冗余,所以今天记录一个改进版的构建函数。还是同样一张图,还是同样的存储结构:这次我们的思路如下:在满二叉树中,每一层的节点树必定是上一层的2倍,如果我们记录父节点的原创 2016-07-15 16:35:51 · 1619 阅读 · 0 评论 -
数据结构与算法简记:根据层次顺序存储结构构建二叉树
在存储满二叉树或近似满二叉树时,按节点层次顺序存储是个不错的主意,我们从根节点开始,逐层由左到右扫描各个节点,依次将节点数据存放到指定的数组中,如果偶尔遇到空的子节点,就用特殊符号来表示。这个树结构已接近满二叉树了,如果使用按层次顺序存储,将会更简单,更节省空间。按照上面的方法,这棵树所对应的存储结构应该是:['A', 'B', 'E', 'C', 'D', '#', 'F']其原创 2016-07-12 12:13:40 · 6226 阅读 · 1 评论 -
数据结构与算法简记:通过前序中序或中序后序构建二叉树
上次记录了广义表生成二叉树的过程,我们也可以通过前序和中序,或者中序和后序,来构建一棵唯一的二叉树。还是同样的图,它的前序,中序,后序遍历序列分别是:pre: ABCDEFin: CBDAEFpost: CDBFEA以下是通过前序和中序构建二叉树的过程:获取前序字符串的第一个字符A,它作为当前根节点,然后扫描中序字符串,找到A的位置,创建根节点存储结构。然后在中序字符原创 2016-07-08 12:10:16 · 6038 阅读 · 0 评论 -
数据结构与算法简记:根据广义表构建二叉树
使用广义表(generalized lists)来表示二叉树非常方便,假如我们有这么一个二叉树:它可以表示为L = (A (B (C, D), E ( , F)) ),直观地表达了树中各个节点之间的关系。今天主要记录如何通过解析这个广义表,构建出真实的树存储结构。下面是其主要思路:逐个获取广义表字符串中除空格之外的每个字符,遇到左括号就标记START_LEFT_CHILD,遇到原创 2016-07-07 11:56:32 · 26410 阅读 · 2 评论 -
数据结构与算法简记:归并排序
归并排序是建立在归并操作上的一种有效的排序算法,简单来讲,就是对一个指定的数据区间进行划分,划分出概念上的左子区间和右子区间,然后对两个子区间进行合并,合并后当前整个区间的数据是顺序存放的。在一趟归并操作开始时,我们需要先获取中间位,把当前区间划分为左子区间和右子区间,然后定义两个指针,分别指向左子区间和右子区间的起始位置,开始比较左右子区间当前指针对应的数据大小,如果左边较小,则将该值放入临时数据原创 2016-07-04 12:12:32 · 955 阅读 · 0 评论 -
数据结构与算法简记:快速排序
快速排序是对冒泡排序的一种改进。首先选定数组中任意位置的元素值做分隔值,然后定义两个指针(可以称为低位和高位),从数组起始位置和结束位置同时向中间靠拢,这个过程中获取它们对应的元素值分别和分隔值进行比较,如果低位指针遇到元素比分隔值大,则暂停,同样地,如果高位指针遇到元素比分隔值小,也暂停,然后交换高低位指针对应的值,交换完成后两指针继续向中间靠拢。一趟下来,比分隔值小的元素都出现在左边,比分隔值大原创 2016-07-01 12:36:28 · 865 阅读 · 0 评论 -
数据结构与算法简记:希尔排序
希尔排序是直接插入排序的增强版。直接插入排序以单个元素为单位进行比较和插入,与之不同的是,希尔排序设定一个增量,初始增量小于数组长度,然后以增量为单位对数组进行分组划分,进而对每个分组内的序列进行直接插入排序。在对所有分组进行一次插入排序之后,增量递减,然后进行下一轮的排序过程,以此类推。最后一轮时,增量已经变为1,等同于一次直接插入排序,不过这时数组元素已趋于有序状态。下面是实现代码原创 2016-06-30 12:12:04 · 1026 阅读 · 0 评论 -
数据结构与算法简记:折半插入排序
上次记录了直接插入排序的算法,这种排序算法需要在每一轮插入操作前,拿待插入元素跟前面排好序的元素逐个进行比较,然后找到合适的位置,这种比较其实是不必要的,因为前面的序列已经是排好序的,我们可以直接通过折半查找方式找到该位置,进而可以节省不少运算成本。折半查找通过高位和低位来限制数据区间,然后获取中间位和它的元素值,跟待插入元素值比较,如果大于待插入元素,则区间折半为前半部分,相似地,如果小于待插入元原创 2016-06-29 12:30:48 · 1214 阅读 · 0 评论 -
数据结构与算法简记:直接插入排序
插入排序把待排序序列看成是一手扑克牌,刚开始是没有顺序的,然后从后面逐个抽出较大的牌,在前面找到合适的位置,这个位置前面的元素都是较大的值,后面的元素都是较小的只,最后插入进去,若干次之后,这手扑克牌就会按照从小到大的顺序排列好,可以排成一个顺子。而直接插入排序是和前面有序序列的元素逐个进行比较,直至找到合适的位置,然后插入。下面是直接插入排序的实现代码:JS版://直接插入排序function原创 2016-06-28 11:15:33 · 966 阅读 · 0 评论 -
数据结构与算法简记:冒泡排序
冒泡排序是一种相邻元素之间比较和交换的排序算法,n个元素的数组从小到大排序时,每一轮比较都会使较大的元素冒泡到数组的末端,然后这个过程会执行n-1趟。由于第一趟比较之后,最大的元素冒泡到了数组末端,下一次再比较时,待排序区间就减去一个元素的位置,依次类推,每次新的待排序区间等于原数组区间减去已排序次数。由于每一趟排序都需要比较相邻元素的大小,如果数组待排序区域剩余的元素已经是排好序了,程序可能会做一些无用功,原创 2016-06-27 17:07:03 · 1359 阅读 · 0 评论 -
数据结构与算法简记:选择排序
最近把数据结构与算法方面的书又温习了一遍,觉得有必要在这里做个备忘记录,以后就算是生疏了,也可以很方便查阅。今天就来简明扼要地总结一下选择排序的要点,拿n个元素的数组升序排列举例:先以数组第一个位置做参照,然后遍历数组剩余元素,遍历过程中会跟第一个的元素进行比较,如果小于第一个元素,则交换;一趟下来,最小值被交换到了第一个位置,然后,数组的第二个位置将作为新的参照,开始新一轮的比较和交原创 2016-06-24 16:25:39 · 1289 阅读 · 0 评论 -
数据结构与算法简记:红黑树
上次记录了AVL树的相关内容,其规定节点左右子树高度之差不超过1,在添加或移除多个节点后能够对自身重新建立平衡,使其仍可维持一棵良好的二叉查找树结构,不过AVL树为了维护良好的结构,在添加或删除频繁时,性能也会相应的下降。一种替代的方案是使用红黑树。红黑树(Red Black Tree) 也是一种自平衡二叉查找树,它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(sym原创 2016-08-15 10:46:37 · 3215 阅读 · 3 评论