随笔分类 -  数据结构

B树和B+树的插入、删除详解
摘要:1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键 阅读全文
posted @ 2020-08-07 14:28 CccccDi 阅读(550) 评论(0) 推荐(0)
判断链表是否有环,以及求出入环节点
摘要:链表有环问题,可以采用两个指针,分别以不同的速度遍历链表,如果存在环,那么快指针和慢指针一定会有相遇的时候,这与以前的数学上得追及问题很类似。 若一个带环链表如下: 分别定义两个指针p1和p2,p1以每次向后移动一个节点,而p2每次向后移动两个结点,在第一次移动中p1指向结点2,p2指向结点7,第二 阅读全文
posted @ 2020-08-03 00:18 CccccDi 阅读(318) 评论(0) 推荐(0)
判断一个数是否是完全二叉树
摘要:对于是否是一颗完全二叉树,可以采用队列来判断,采用类似于层序遍历的方法(不同点是其左右孩子为null时,依旧入队)。 首先,来看看一个非完全二叉树的入队以及出队的顺序: 再来看看完全二叉树,其入队以及出队的顺序应该如下: 对比上面两图可以看出,当为一颗完全二叉树的时候,当出队列的一个节点为null, 阅读全文
posted @ 2020-08-02 17:53 CccccDi 阅读(228) 评论(0) 推荐(0)
堆排序
摘要:二叉堆的构建,删除节点以及自我调整等基础的操作是实现堆排序的基础(详看上一篇)。 在最大堆中,如果删除了堆顶元素,然后经过自我调整后,第二大的元素就会被交换上来,称为最大堆的新堆顶。(在堆排序中的删除,并不是真正的删除,而是将其与完全二叉树最后的一个元素交换位置)。例如下图分析: 对于上图,黑色节点 阅读全文
posted @ 2020-08-02 00:10 CccccDi 阅读(134) 评论(0) 推荐(0)
二叉堆
摘要:二叉堆的本质是一种完全二叉树,它分为两种类型,分别是最大堆和最小堆。 最大堆的任何一个父节点的值,都大于或者等于它的左右孩子节点的值;最小堆的任何一个父节点的值都小于或等于它的左右孩子结点的值。二叉堆的根结点叫做堆顶。由其性质可以知道,最大堆的堆顶元素是整个堆得最大值,最小堆得的元素是整个堆得最小值 阅读全文
posted @ 2020-08-01 00:15 CccccDi 阅读(190) 评论(0) 推荐(0)
快速排序
摘要:快速排序的平均时间复杂度是O(nlogn),最坏情况下为O(n^2)。 法一: 原始数据如上,并且设置两个指针,以及一个基准pivot = 4(这里采用首元素为基准,基准可以是随机一个元素)。 在第一次循环中,从right指针开始,让指针指向的元素与基准元素比较,指针指向元素大于等于基准元素时,指针 阅读全文
posted @ 2020-07-31 13:07 CccccDi 阅读(189) 评论(0) 推荐(0)
二叉树的三种遍历非递归实现(栈) 以及层序遍历(队列)(java)
摘要:先序遍历:根-->左-->右的形式 public static void preOrderTraveralWithStsck(Node node){ Stack<Node> stack = new Stack(); //当节点的左右孩子全为空并且,栈空表示遍历完毕 while (node != nu 阅读全文
posted @ 2020-07-26 23:24 CccccDi 阅读(325) 评论(0) 推荐(0)
二叉树的创建与遍历
摘要:此时有这样一棵树,其先序遍历:ABCDEFGH;中序遍历:CBEDFAGH;后序遍历:CEFDBHGA;想要以输入结点的方式来创建树。可以考虑一个节点创建成功在创建其左右结点,若其左右结点为空,则返回至上一个结点继续创建,直到创建完毕。 创建树的结点: class BNode{ private BN 阅读全文
posted @ 2020-03-20 23:40 CccccDi 阅读(317) 评论(0) 推荐(0)
二叉树
摘要:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。 二叉树性质: 若二叉树的层次从0开始,则在二叉树的第i层最多有2^i 个结点。(i>= 0) (证明用数学归纳法)。 高度为k的二叉树最多有2^(k+1)-1个结点。 (k>= 阅读全文
posted @ 2020-03-19 23:07 CccccDi 阅读(438) 评论(0) 推荐(0)
摘要:1.树的定义: 树是由n (n>= 0)个结点组成的有限集合。如果 n=0 ,称为空树;如果 n>0,则 有一个特定的称之为根(root)的结点, 它只有直接后继,但没有直接前驱; 除根以外的其它结点划分为m (m >= 0)个互不相交的有限集合TO, T1, .... ..,Tm-1, 每个集合又 阅读全文
posted @ 2020-03-18 22:53 CccccDi 阅读(172) 评论(0) 推荐(0)
单链表的反转(开辟新的空间和不开辟额外的空间)
摘要:利用新链表: 思路: 1.定义一个新的链表; 2.从头到尾遍历原来的链表,每遍历一个节点,将其取出,并且将其放在新的链表的最前端,也就是第一个有效结点; 3.将原来的链表的head.next = 新的链表的head.next。 主要代码: public void reverSetList(){ // 阅读全文
posted @ 2020-01-15 17:29 CccccDi 阅读(826) 评论(0) 推荐(0)
插入排序
摘要:算法思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包n-1个元素,排序过程中每次从无序表中取出一个元素,把他的元素依次与有序表的元素进行比 较,将它插入到有序表中的适当位置,使之成为新的有序表。 每次在颜色较浅的无序序列里,选择一个元素,放入有序序列的合 阅读全文
posted @ 2020-01-14 16:05 CccccDi 阅读(182) 评论(0) 推荐(0)
冒泡排序及其优化
摘要:冒泡排序是一种很实用的排序方法,其主要思想是:在要排序的一组数中,对当前还未排好序的数,对从前往后对相邻的两个数依次进行比较和调整,让较大的数往后移(往下移),较小的数往前走(往上冒),即相当于每次找到一个最大值,并且相对于在后面,因此假如一组数有 n个数,只需要比较 n-1 次。例如一组数为 2, 阅读全文
posted @ 2019-06-11 11:34 CccccDi 阅读(153) 评论(0) 推荐(0)