![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
走上Java的不归之路
没有一个人天生就是天才,长久的坚持与努力才是王道!
展开
-
二叉树~删除节点
要求: 1)如果删除的是叶子节点,则删除叶子节点 2)如果删除的是非叶子节点,则删掉整个子树 3)测试,删掉3号和5号节点 思路: 首先考虑: 考虑如果树是空树,如果只有一个root节点,那么等价于将整个二叉树置空 然后进行下面操作 1)因为二叉树是单向的,所以我们是判断当前节点的子节点是否需要删除节点,而不能判断当前这个节点上是不是需要删除的节点 2)如果当前节点的左子节点不为空,且左子节点就是要删除的节点,就将this.left == null;并且返回(结束递归) 3) 如果当原创 2022-04-14 10:36:23 · 2086 阅读 · 1 评论 -
二叉树~查找指定节点
要求: 1)请编写前序查找,中序查找和后序查找的方法。 2) 并分别使用手种查找方式,查找heroNo= 5的节点 3) 并分析各种查找方式,分别比较了多少次 思路如下: 代码实现: //二叉树的遍历:前序、中序、后序 public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一个二叉树 BinaryTree binaryTree = new BinaryTr.原创 2022-04-13 15:33:48 · 883 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历
二叉树遍历的说明: 前序遍历:先输出父节点,再遍历左子树和右子树 中序遍历:先遍历左子树,再输出父节点,再遍历右子树 后序遍历:先遍历左子树,再遍历右子树,最后输出父节点 小结:看输出父节点的顺序,就确定是前序中序还是后序 代码实现: //二叉树的遍历:前序、中序、后序 public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一个二叉树 Binar原创 2022-04-12 14:55:49 · 723 阅读 · 0 评论 -
数组、链表、树存储方式分析
二叉树: 1.为什么要有树这种数据结构? 1)数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动, 效率较低 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历...原创 2022-04-12 13:26:32 · 441 阅读 · 0 评论 -
哈希表(散列)
看一个实际需求,Google公司的一个上机题 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,姓名,年龄,住址,,,)当输入该员工的id时,要求查找该员工的所有信息 要求:不适用数据库,尽量减少内存,速度越快越好==>哈希表(散列) 一、哈希表的基本介绍 散列表(Hash table,也叫哈希表)是根据关键码值(Key value)而直接进行访问的数据结构,也就是说它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫散列表。原创 2022-04-11 16:15:06 · 616 阅读 · 0 评论 -
递归~从应用场景到实际问题解决----代码实现
一、递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 二、递归的调用机制 三、递归能解决什么样的问题? 1)各种数学问题,如八皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛) 2)各种算法问题也会使用到递归:比如快排,归并排序,二分查找,分治算法, 3)将用栈解决的问题-->递归代码比较简洁 四、使用递归需要遵守的重要规则 1)执行一个方法时,就会创建一个新的受保护的独立空间(占空间原创 2022-04-06 09:58:28 · 151 阅读 · 0 评论 -
栈~基本介绍与用数组模拟栈:从分析到代码实现
栈:stack; 栈是一个先进后出的有序列表; 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端, 为变化的一端, 称为栈顶(Top),另一端为固定的一 端,称为栈底(Bottom); 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。 出栈(pop)和入栈(push)的概念如图: 栈的应用场景: 子程序的调用:在跳往子程序前,会先将下个指令的地址.原创 2022-03-30 14:11:11 · 65 阅读 · 0 评论 -
单向环形链表———约瑟夫问题
Josephu问题为:设编号为1, 2,... n的n个人围坐一圈, 约定编号为k (1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理Josephu问题: 先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。 单..原创 2022-03-29 16:51:03 · 791 阅读 · 0 评论 -
双向链表的应用实例
使用带head头的双向链表实现--水浒英雄排行榜管理单向链表的优缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找 单向链表不能自我删除,需要靠辅助节点,而双向链表则可以自我删除,所以前面单向链表章节删除节点,总是找到temp,temp是待删除节点的前一个节点 分析双向链表的增删改查 遍历和单向链表一样,只是可以向前,也可以向后 添加:默认添加到最后 先找到这个双向链表的最后一个节点 temp.next = newHeroNode; newHeroNo.原创 2022-03-28 16:59:39 · 348 阅读 · 0 评论 -
单向链表的增删改查总结~代码
//定义HeroNode,每个HeroNode对象就是一个节点 class HeroNode{ public int no; public String name; public String nickname; public HeroNode next; //指向下一个节点 //构造器 public HeroNode(int no, String name, String nickname) { this.no = no; .原创 2022-03-26 15:33:51 · 84 阅读 · 0 评论 -
单链表之删除节点
思路: 我们需要先找到删除这个节点的前一个节点 temp.next = temp.next.next 被删除的节点,将不会有其他引用指向,会被垃圾回收机制gc回收 //删除节点 //head节点不能动,因此我们需要一个辅助节点temp,帮助我们找到待删除节点的前一个节点 //说明:我们在比较时是temp.next.no和需要删除的节点的no比较 public void deleteNode(int no){ HeroNode temp = head; ..原创 2022-03-26 15:29:36 · 1248 阅读 · 0 评论 -
单链表节点的修改~
//修改节点的信息,根据编号(no)来修改 public void update(HeroNode newHeroNode){ //判断是否为空 if(head.next == null){ System.out.println("链表为空!"); return; } //找到需要修改的节点,根据编号no //定义一个辅助变量,来帮助我们遍历寻找节点 He.原创 2022-03-26 14:31:07 · 409 阅读 · 0 评论 -
单链表之按顺序插入元素
单向链表第二种添加方式: 按照排名将节点插入指定位置,如果指定位置有节点,就提示添加失败! 需要按照编号的顺序添加 首先找到新添加节点的位置,通过辅助变量,遍历来搞定 新的节点.next = temp.next 将temp.next = 新的节点 //第二种方式插入节点 //按照英雄排名插入到指定位置,如果有这个排名,则提示插入失败 public void addNode2(HeroNode heroNode){ //因为我们找的temp是位于添加位置的前一个原创 2022-03-26 14:02:50 · 1216 阅读 · 1 评论 -
链表添加元素~从分析到代码实现
一、链表是有序的列表,它在内存中的存储如下: 链表是以节点的方式存储的,是链式存储 每个节点包含data域(存数据),next域(指向下一个节点) 链表的各个节点不一定是连续存储的 链表分带头节点的链表和不带头节点的链表,根据实际的需求来确定 二、单链表的添加: 添加: 1.先创建一个头节点,用于表示单链表的头 2.后面我们每添加一个节点,就直接加入到链表的最后 遍历: 1.通过一个辅助变量,帮助遍历整个单链表 三、代码实现 //定义HeroNode,每个HeroNode..原创 2022-03-26 12:18:12 · 1650 阅读 · 0 评论 -
数组模拟队列--环形队列,完成队列复用
问题分析并优化: 目前数组队列使用一次就不能用了,没有达到复用的效果 将这个数组使用算法:改进成一个环形的队列,取模 % 思路: 将front变量的含义做调整:front变为指向队列的第一个元素,也就是说array[front]是队列的第一个元素,front的初始值为0 将rear变量的含义做调整:rear变为指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定。rear的初始值为0 当队列满使得条件是:(rear +1)%maxSize == front 当队列为空的条件是:rea原创 2022-03-25 19:11:42 · 60 阅读 · 0 评论 -
队列--使用数组模拟队列
一、队列简介: 队列是一个有序列表,可以用数组或链表实现 遵循先入先出原则,也就是说:先存入队列的数据,要先取出,后存入的数据后取出 数组模拟队列:队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图,其中MaxSize是该队列的最大容量 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front 会随着数据输出而改变,而rear则是随着数据输入而改变,如上图所示: ...原创 2022-03-25 14:35:12 · 545 阅读 · 0 评论 -
稀疏数组棋盘保存与恢复问题--从分析到代码实现
一、稀疏数组的应用场景 用一个二维数组存储棋子的位置,大部分二维数组的值都默认为是0,记录了很多没有意义的数据,考虑用稀疏数组压缩。 二、基本介绍 概念:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1)记录数组一共有几行几列,有多少个不同的值 2)把具有不同值的元素的行列及值记录在一个小规模的数组中, 从而缩小程序的规模 ...原创 2022-03-25 12:22:10 · 271 阅读 · 0 评论 -
数据结构介绍
数据结构与算法原创 2022-03-24 20:42:05 · 37 阅读 · 0 评论