数据结构
@阿证1024
这个世界上最好的语言就是你的实力。
展开
-
数据结构和算法之图的DFS、BFS
图遍历介绍所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历基本思想图的深度优先搜索(Depth First Search) 。1)深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。2)我们可原创 2020-05-22 14:52:31 · 152 阅读 · 0 评论 -
Java数据结构和算法之B树、B+树、B*树介绍说明
B树的介绍:前面已经介绍了2-3树和2-3-4树,他们就是B树(英语:B-tree 也写成B-树),这里我们再做一个说明,我们在学习Mysql时,经常听到说某种类型的索引是基于B树或者B+树的,如图:B树的说明:1)B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是42)B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点3)关键字集合分布在整颗树中, 即原创 2020-05-21 14:24:26 · 188 阅读 · 0 评论 -
Java数据结构和算法之二叉排序树
二叉排序树介绍二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:二叉排序树的删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑删除叶子节点 (比如:2, 5, 9, 12)删除只有一颗子树的节点 (比如:1)删原创 2020-05-20 19:53:25 · 278 阅读 · 0 评论 -
Java数据结构和算法之哈夫曼编码
哈夫曼编码原理:案例代码实现:package com.atguigu.huffmantree;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;public class HuffmanCodes { public static vo原创 2020-05-17 14:29:02 · 292 阅读 · 1 评论 -
Java数据结构和算法之哈夫曼树
基本介绍:1)给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。构成赫夫曼树的步骤:1)从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树。2)取出根节点权值最小的两颗二叉树 。3)组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和原创 2020-05-16 14:34:22 · 245 阅读 · 0 评论 -
Java数据结构和算法之堆排序
堆排序基本介绍:1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。3)每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在原创 2020-05-16 14:03:17 · 157 阅读 · 0 评论 -
Java数据结构和算法之前中后序线索化二叉树、前中遍历二叉树
线索二叉树基本介绍:n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。一个结点的前一个结点,称为前驱结点。一个结点的后一个结点,称为后继结点。线原创 2020-05-15 13:14:19 · 408 阅读 · 4 评论 -
Java数据结构和算法之二叉树的前中后遍历、前中后查找、删除
二叉树的概念:1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2)二叉树的子节点分为左节点和右节点。3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。4)如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。注意:1)遍历的方法和原理估计大家都懂,这里不再赘述。代码里面有三种遍历方式的实现,认真看看就行了。2)查找和遍历类似,只不原创 2020-05-13 17:34:22 · 191 阅读 · 0 评论 -
Java数据结构和算法之顺序存储二叉树
顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。要求:1)上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]2)要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树1)第n个元素的左子节点为 2 * n + 12)第n个元素的右子节点为 2 * n +原创 2020-05-13 14:28:28 · 129 阅读 · 0 评论 -
Java数据结构和算法之数制的转换
题目:将一个十进制数n转换成二进制数。解题思路:十进制数转换为二进制,可以采用辗转相处、取余数的方法得到。例如十进制数11转二进制数。先求余数11%2=1,求商11/2 = 5,然后用商5再求余数,求商,直到商为0,结束。11%2 = 1 11 / 2 = 55%2 = 1 5 / 2 = 22%2 = 0 2 / 2 = 11%2 =1 1/ 2 = 0代码如下:package com.guigu.stack;import java.util.Scanne原创 2020-05-10 15:06:38 · 560 阅读 · 0 评论 -
Java数据结构和算法之删除链表中的重复元素
题目:用单链表保存m个整数,节点的数据结构为(data,next),且|data| <= n(n为正整数)。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的节点,仅保留第一次出现的节点而删除其余绝对值相等的节点。解题思路: 数据大小有范围限制,因此可以设置一个辅助数组记录该数据是否已出现,如果已经出现,则删除;如果未出现,则标记。一趟扫描完成。代码如下:package com.guigu.LinkedListDemo;public class DistinctDat原创 2020-05-10 14:57:40 · 705 阅读 · 0 评论 -
【新浪面试题】如何技高一筹解决查找单链表中的倒数第k个结点
解决方法:使用快慢指针,慢指针先不动,快指针先走k-1步,然后两个指针一起以同样的速度走。当快指针到达终点时,慢指针正好停留在倒数第k-1个节点。因为它们之间的距离始终保持k-1。代码如下:package com.guigu.LinkedListDemo;public class SpeedAndSlow { public static void main(String[] args)...原创 2020-05-07 19:48:16 · 145 阅读 · 0 评论 -
利用快慢指针解决查找链表的中间节点问题
问题描述:找到链表的中间节点,并输出节点的信息。解题思路:定义一个快指针,再定义一个慢指针,快指针每次走两步,慢指针每次走一步。当快指针指向结尾的时候,慢指针刚好指向中间节点。代码如下:注意:如果你对代码中的 speed != null 这个判断条件有疑问的话,你把节点设置成奇数个你就懂了。package com.guigu.LinkedListDemo;public class ...原创 2020-05-07 19:06:50 · 655 阅读 · 3 评论 -
腾讯面试题:单链表的反转
链表反转:采用头插法进行链表的反转操作:创建一个新的链表,遍历旧的链表,每取出来一个数据就按照头插法的方式插入行的链表。直接在此链表上操作,完成链表的反转。我采用的是第一种方式。代码如下:package com.guigu.LinkedListDemo;public class ReverseLinkedListDemo { public static void main(St...原创 2020-05-07 18:22:36 · 151 阅读 · 0 评论 -
数据结构之顺序表实现
语言:C++注意点:create函数里面最后输入-1退出时,-1这个值也存入了顺序表里面,当然顺序表的长度也就自然的加1,也就是顺序表的最后一个值存的是-1。#include<iostream>using namespace std;#define maxsize 100#define elemtype int//动态定义顺序表结构体typedef struct{...原创 2020-01-31 11:24:13 · 228 阅读 · 0 评论