数据结构
李沐泽
学习阶段,欢迎大家来讨论 QQ:3092455245.微博发表出错地方,望各位大佬指正。谢谢
展开
-
最简单的B树——2-3树
由于2-3树属于B树,那么B树的所有叶子节点都在同一层这个条件它也是满足的;2-3树之所以叫2-3树,主要是由于其构成是由二节点和三节点构成。二节点:有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点;三节点:有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点;根据2-3插入规则构建2-3树插入规则:除了上述规则外:需要注意的是2-3树的值大小依然遵循二叉排序树的规则。此处特别需要注意的是该节点满时,对于节点的拆分。...原创 2020-09-20 21:15:38 · 1028 阅读 · 1 评论 -
和为S的两个数
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。分析先确定一个数,再依次判断数组中剩余的数字与它的和是不是等于s,若等于s则返回这两个数。代码public class Solution { public static void main(String[] args) { int[] arr = {10,26,30,31,47,60}; int[] arrayList = two原创 2020-09-13 13:54:30 · 145 阅读 · 0 评论 -
两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共节点。分析代码class ListNode{ public int data; public ListNode next; public ListNode(int data) { this.data = data; } @Override public String toString() { return "ListNode{" + "data=原创 2020-09-11 11:15:45 · 141 阅读 · 0 评论 -
1~n整数中1出现的次数(整数中1出现的次数)
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。分析public class Solution { public static void main(String[] args) { System.out.println(countDigitOne(12)); } /** * 1~n整数中1出现的次数 * @param n原创 2020-09-10 17:21:17 · 1377 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析代码public class Solution { public static void main(String[] args) { int[] arr = {1, 2, 3, 2, 5}; System.out.println(原创 2020-09-08 11:16:26 · 531 阅读 · 0 评论 -
栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。分析总结上述过程,则可得到以下规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;如果下一个弹出的数值不是栈顶数字,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶位置;如果所原创 2020-09-07 16:29:07 · 133 阅读 · 0 评论 -
反转链表
题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。分析代码class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } @Override public String toString() { return "ListNode1{" + "val="原创 2020-09-06 16:38:42 · 118 阅读 · 0 评论 -
数值的整数次方
题目实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。分析public class Solution { public static void main(String[] args) { Solution15 s = new Solution15(); System.out.println(s.Power(2.00000, -2147483648)原创 2020-09-06 09:59:23 · 181 阅读 · 0 评论 -
二进制中1的个数
题目输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。代码public class Solution { public int NumberOf1(int n) { String binaryString = Integer.toBinaryString(n); int sum = 0; for (int i = 0; i < binaryString.length();i++){ if (bin原创 2020-09-04 20:35:03 · 203 阅读 · 2 评论 -
矩形覆盖
题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析代码递归实现public class Solution13 { public static void main(String[] args) { System.out.println(RectCover(4)); } public static int RectCover(int target) {原创 2020-09-04 19:22:23 · 156 阅读 · 0 评论 -
不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析代码public class Test { public static void main(String[] args) { System.out.println(Add(5,17)); } public static int Add(int num1,int num2){ int i = 0; do { i++;原创 2020-09-03 20:49:10 · 109 阅读 · 0 评论 -
二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析代码class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}public class Test { public s原创 2020-09-03 19:53:15 · 171 阅读 · 0 评论 -
二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。分析代码实现class TreeNode{ int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}/** 操作给定的二叉树, 将其变换为源二叉树的镜像。 */public class Solution { pub原创 2020-09-03 17:37:14 · 238 阅读 · 0 评论 -
旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。思路public class Solution { public static void main(String[] args) { int[] arr ={3,4,5,1,2}; System.out.println(minArray(原创 2020-09-03 17:08:20 · 144 阅读 · 0 评论 -
用两个栈实现队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路解析代码import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(in原创 2020-09-03 15:02:28 · 112 阅读 · 0 评论 -
堆排序
堆排序的基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它是最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树: 大顶堆:每个节点的值都大于或定域其左右子节点的值 小顶堆:每个节点的值都小于或等于其左右子节点的值注意:没有要求节点的左原创 2020-08-27 17:06:17 · 332 阅读 · 0 评论 -
二叉树的顺序存储
二叉树顺序存储从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数据可以转换成树,树也可以转换成数组。顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树;第n个元素的左子节点为 2*n+1;第n个元素的右子节点为 2*n+1;第n个元素的父节点为 (n-1)/2;n:表示二叉树中的第几个元素(编号从0开始)顺序存储二叉树的遍历代码/** * 编写ArrayBinaryTree * 实现顺序存储二叉树遍历 */class ArrayBinaryTree{原创 2020-08-26 13:01:54 · 1623 阅读 · 0 评论 -
二叉树-删除指定节点
若删除的节点是叶子节点,则删除该节点若删除的节点是非叶子节点,则删除该子树删除节点的方法写的不是怎么好,不能删除根节点,看来是递归这里还是不够明了,求道友们推荐写递归和二叉树的文章删除思路分析/** * 树的节点 */class TreeNode{ public int rank;//排名 public String name;//姓名 public TreeNode left;//左节点 public TreeNode right; /**原创 2020-08-26 09:50:45 · 612 阅读 · 0 评论 -
二叉树-查找指定节点
二叉树查找指定节点思路前序查找思路当前节点是否为空,不为空判断当前节点的rank是否等于要查找的rank若等于,则返回当前节点;若不等于,则判断当前节点的左子节点是否为空,如果不为空,则继续向左递归前序查找,如果左递归前序查找,找到了节点,则返回;若没找到,则继续判断当前节点的右子节点是否为空,如果不为空,则继续向右递归前序查找,如果右递归前序查找,找到了节点,则返回。若没找到则为空。/** * 树的节点 */class TreeNode{ public int rank原创 2020-08-25 17:07:42 · 4604 阅读 · 2 评论 -
二叉树深度优先遍历
二叉树深度遍历的深度优先就是偏向于纵向,“一头扎到底”的访问方式。深度优先遍历主要分为前序遍历、中序遍历、后序遍历。举例遍历如下二叉树:1、前序遍历输出顺序是:先输出父节点,再遍历左子树和右子树。/** * 树的节点 */class TreeNode{ public int rank;//排名 public String name;//姓名 public TreeNode left;//左节点 public TreeNode right; /**原创 2020-08-24 20:46:08 · 1554 阅读 · 0 评论 -
哈希表
哈希表是根据关键码值(Key value)而直接进行访问的数据结构。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,插入和删除容易。那么将两者结合,做出一种寻址容易,插入删除也容易的数据结构,那就是哈希表。哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:可以看出,左边是个数组,数组的每个成员是个指针,指向一个链表的头,从图中可以看出有的链表为空,有的链表有很多元素,这主要是由于根据元素一些特性把元素分配到不同的链表中导致的原创 2020-08-24 15:40:41 · 127 阅读 · 0 评论 -
插值查找
插值查找算法类似于二分查找,不同的是插值查找每次从自实行mid开始查找,其实就是根据数据的散列程度(斜率),来调节每次查找的时的分割点。二分查找中: mid = (left + right) / 2 = left + (1/2)*(right-left)自适应查找中: mid = left + [(right-left) / (arr[right] - arr[left])] *(findValue - a[left])举例代码实现/** * 插值查找算法 */public class原创 2020-08-23 21:07:39 · 224 阅读 · 0 评论 -
二分查找
二分查找对需要查找的序列有两个要求:1.该序列必须是有序序列(即即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以)。2.该序列必须是顺序存储结构存储。举例代码实现/** * 二分查找算法 */public class BinarySearch { public static void main(String[] args) { int[] arr = {2,5,7,9,12,14,20,26,30}; int findValueIndex原创 2020-08-23 19:34:40 · 152 阅读 · 0 评论 -
线性查找算法
import java.util.Scanner;/** * 线性查找算法 */public class SeqSearch { public static void main(String[] args) { int[] arr = {1,9,11,-1,34,89}; Scanner scanner = new Scanner(System.in); System.out.println("请输入一个数字:"); in原创 2020-08-23 17:14:41 · 247 阅读 · 0 评论 -
基数排序
## 基数排序基本思想基数排序是效率高的稳定性排序法,是桶排序的扩展,它的思想将整数按照位数切割成不同的数字,然后按每个数分别比较。即将所有待比较数值统一为同样的数列长度,数位较短的数前面补0,然后从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成之后,数列就变成了一个有序数列。举例代码编写演变过程代码import java.util.Arrays;/** * 基数排序 */public class RadixSort { public static voi原创 2020-08-23 16:55:52 · 164 阅读 · 0 评论 -
归并排序
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略。合并两个有序数组的流程代码import java.util.Arrays;/** * 归并排序 */public class MergeSort2 { public static void main(String[] args) { int[] arr = {5,8,6,3,9,2,1,7}; System.out.println("排序前: "+Arrays.toString(原创 2020-08-23 12:30:51 · 147 阅读 · 0 评论 -
快速排序
快速排序思想快速排序是在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。举例双边循环法代码实现import java.util.Arrays;public class QuickSort { public static void main(String[] args) { //int[] arr = new int[] {4,7,6,5,3,2,8,1}; int arr原创 2020-08-22 15:51:28 · 152 阅读 · 0 评论 -
希尔排序
希尔排序思想希尔排序也是一种插入排序,它是简单插入排序经过改进后的一个更高效的版本,也称为缩小增量排序。它的基本思想是: 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中; 然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。 然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。举例代码编原创 2020-08-21 14:07:10 · 191 阅读 · 0 评论 -
插入排序
插入排序思想1.把n个待排序的元素看成一个有序列表和一个无序列表,2.开始时有序列表中只有一个元素,无序列表中包含n-1个元素,3.排序过程中每次从无序列表中取出第一个元素,把它依次与有序列表元素进行比较,将它插入到有序列表中的适当位置,使之成为新的有序列表。举例代码编写演变过程代码 public static void main(String[] args) { int arr[] = {5,8,6,3,9,2,1,7}; System.out.pr原创 2020-08-21 11:27:21 · 143 阅读 · 0 评论 -
选择排序
选择排序思想选择排序基本思想:排序n个元素,第一次从数组arr[0]—arr[n-1]中选择最小值,与arr[0]交换;第二次从arr[1]—arr[n-1]中选择最小值,与arr[1]交换;第三次从arr[2]—arr[n-1]中选择最小值,与arr[2]交换;……第n-1次从arr[n-2]—arr[n-1]中选择最小值,与arr[n-2]交换;总共交换n-1次,则可得到从小到大的有序序列。举例代码编写演变过程代码import java.util.Arrays;/** * 选择排序原创 2020-08-20 21:26:40 · 146 阅读 · 0 评论 -
冒泡排序
冒泡排序思想把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或者等于右侧相邻元素时,位置不变。举例原创 2020-08-20 20:10:05 · 145 阅读 · 0 评论 -
递归——迷宫问题
明确问题1. 明确地图的那个位置开始出发(1,1)2. 明确走到那个位置,表示通路找到3. 明确走迷宫时候的策略:下 —> 右 —> 上 —> 左。4. 约定:0表示没走过的点,1表示墙,2表示通路可以走,3表示该点已经走过,但是走不通。package com.liang.recursion;import java.util.Random;/** * 小小迷宫 */public class Maze { public static void main(S原创 2020-08-20 17:19:19 · 190 阅读 · 0 评论 -
递归——基础分析
递归是一个重要的算法,同时感觉不好讲不好写。编写递归在覃超老师的算法课中提到主要分为以下四步。递归需明确 明确函数功能,这个不用说,不管编写什么函数,一定需要明确的是编写函数的功能。 明确递归的结束(退出递归)条件:如果没有结束条件,则会无线递归,出现死归。 处理当前层逻辑:处理当前层要进行的逻辑 下探到下一层:完成递归 清理当前层:当前层可能需要清理一些变量计算n的阶乘1. 明确函数功能:计算n!=1×2×3×...×(n-1)×n public static int fa原创 2020-08-20 16:28:35 · 149 阅读 · 0 评论 -
中缀表达式转后缀表达式
111原创 2020-08-20 11:51:42 · 457 阅读 · 0 评论 -
逆波兰(后缀表达式)计算器
后缀表达式对于人来说是比较难理解的,但是对于计算机来说,缺失比较简单易懂的结构,这主要是由于计算机内存是栈式结构。当我们知道一个表达式的后缀表达式的时候,可以通过栈很快的完成计算器功能。如下:由上面的执行流程可以很快的分析出来后缀表达式的思路。后缀表达式思路代码实现import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * 逆波兰表达式计算器 */public class PolandN原创 2020-08-19 16:58:23 · 592 阅读 · 0 评论 -
栈实现综合计算器(中缀表达式)
思路图解例子分析原创 2020-08-18 21:15:52 · 217 阅读 · 0 评论 -
数组模拟栈
栈的结构相当于生活中常见的一端封闭,一端开头的容器,如下图底部封死后,只能通过上边的端口来存取东西,即先放入的后取出。栈就是这样一种结构。栈:是一种线性数据结构,并且栈中的元素只能先入后出,并且最早进入的元素存放的位置叫栈底(封闭端),最后进入的元素存放的位置叫栈顶(开口端)。可以通过数组或者链表来实现栈。数组实现栈思路分析数组实现栈代码/** * 通过数组来模拟栈 */class ArrayStack{ private int size;//栈的大小 private原创 2020-08-18 10:41:05 · 212 阅读 · 0 评论 -
双向链表的基本操作
单向链表,单向传递,当需要找一个节点的前置节点时候,显得比较复杂,而双向链表可以向前向后查找。那么对于节点不仅拥有指向后置节点的next指针,而且拥有指向前置节点的prev指针。双向链表的基本操作- 查找节点:链表在查找节点元素的时候,只能从节点开始一个一个节点遍历查找。只是双向链表可以向前也可以向后查找。查找节点和单链表没什么大的区别。- 修改节点:和单链表修改方式一样。- 添加...原创 2020-08-17 20:42:08 · 244 阅读 · 0 评论 -
单向环形链表
这是一个很有意思的问题,又称为约瑟夫环。问题为:设置n个人围坐一圈,编号从1到n,若从其中一个人开始报数,数到k的人出列,他的下一位接着从1开始报数,数到k的人出列,这样以此类推,直到没有人出列为止,由此产生一个出队编号的序列。约瑟夫问题示意图用语言来描述,很多时候看的有点不清不楚的,接下来通过图来简单的说明下这个问题。...原创 2020-08-17 20:38:20 · 375 阅读 · 0 评论 -
单向链表练习
求单链表中有效节点的个数- 分析:当链表的头节点是无效数据时: 头节点的next指针指向null,则表明此链表无有效值 头节点的next指针指向不为null时,则对链表进行遍历,统计其有效数据个数 /** * 获取链表长度 * @return */ public int getValidLength(){ int length原创 2020-08-16 20:16:55 · 168 阅读 · 0 评论