![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
猴子敲代码
猴子胖成猩猩
展开
-
二分搜索树前序遍历非递归写法
使用栈实现非递归的前序遍历二分搜索树,除了根节点root外先入栈右节点,后入栈左节点。package blacktv.tree;import java.util.Stack;/** * 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性 */public class BinarySearchTree<E extends Comparable<E>> { private Node root;//根节点 private Int..原创 2021-10-08 14:26:10 · 246 阅读 · 0 评论 -
深入理解二分搜索树前中后遍历
前中后序遍历二分搜索树如上图所示,本质是访问本节点的值的时机不一样。原创 2021-10-08 14:23:55 · 121 阅读 · 0 评论 -
前序、中序、后序遍历二分搜索树(遍历二分树)-java
之所以叫前序遍历是因为先访问左子树,之后遍历右子树,由于前序遍历的输出结果能完整的反应二分树的结构,所以一般使用前序遍历/** * 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性 */public class BinarySearchTree<E extends Comparable<E>> { private Node root;//根节点 private Integer size = 0; /** ...原创 2021-09-08 10:54:17 · 239 阅读 · 0 评论 -
深入理解二分搜索树前中后遍历-java
前中后序遍历二分搜索树如上图所示,本质是访问本节点的值的时机不一样。原创 2021-09-06 14:34:49 · 72 阅读 · 0 评论 -
二分搜索树添加、查询节点-java
叶子结点没有左右节点,有子节点不算叶子节点,根节点没有父节点28>22>16>13 28<29<30<42可以在泛型里添加一条规矩,必须实现Comparable接口,保证具有可比较性public class BST<E extends Comparable<E>> {}二分搜索树添加节点,如果小于根节点则添加到左子树,如果大于根节点添加到右子树。比如...原创 2021-09-01 10:44:40 · 252 阅读 · 1 评论 -
双向链表与双向循环链表
循环链表的末尾指向dummyHead第一个节点是66下面的1代表第二个节点在数组的索引为1的地方,而99这一个节点的下一个节点索引为-1则该节点为最后一个节点。原创 2021-08-25 10:32:25 · 80 阅读 · 0 评论 -
用单向链表实现队列-Java
本文档编写的队列用的是根据单向链表编写的单向链表改进后编写的。总效果和循环队列是一样的。接口:package blacktv.queue;/** * 实现队列需要完成的接口 */public interface Queue<E> { /** * 入队 * * @param e */ public void enqueue(E e); /** * 出队,并返回出队的元素,如果队列为空则返回n...原创 2021-08-20 10:25:23 · 181 阅读 · 0 评论 -
用单向链表实现栈-Java
链表的读取、添加、删除第一个节点的时间复杂度是O(1),所以我们可以用链表来实现一个栈,最关键的是不需要考虑栈的大小,所以链表栈会比数组栈时间复杂度会低。接口package blacktv.stack;/** * 栈需要实现的一些接口 */public interface Stack<E> { /** * 入栈 * * @param e */ public void push(E e); /** ...原创 2021-08-18 14:14:01 · 978 阅读 · 0 评论 -
单向链表-JAVA
如果某个节点的next是null则代表该节点是最后一个节点,属性名为head的为第一个节点。虚拟头结点(dummyHead)对于链表的使用者来说毫无意义,只是为了让头结点固定不改动、实现起来更方便而设计出来的一个概念。实现代码package blacktv.linkedlist;/** * 在008号文档编写的单向列表基础上,为提高在此基础上实现的队列的效率,牺牲了一些删除节点的速度, * 将从末尾添加节点的性能从O(n)提高到O(1)。 */publi...原创 2021-08-16 10:00:20 · 115 阅读 · 0 评论 -
效率更高的循环队列-Java
数组队列中的出队,在时间复杂度上是O(n)复杂度,因为你删除数组首端,后面的数据都要左移一位。我们可以记录一下队首的索引和队尾索引,入队时队尾索引+1,出队时队首索引-1,当队首索引与队尾索引相等时代表队列空了,完成一次循环。入队五个元素,队尾索引(tail)自增五次出队一个元素则队首索引(front)自增一次。当数组尾部填满的时候不着急扩充,先看看数组首部是不是还有空余,有空余则指向数组首部。此时才不能继续入队,若想要继续入队只能进行扩容,毕竟tail == front原创 2021-08-13 10:10:55 · 369 阅读 · 0 评论 -
什么是队列以及用数组实现队列-Java
就和我们现实生活中排队一样,队列就是先进先出,从队尾进,从队首出然后使用https://blog.csdn.net/test253506088/article/details/119538593编写的动态数组来实现一个队列ArrayQueuepublic class ArrayQueue<E> implements Queue<E> { private Array<E> array; /** * 传入队列容量上限 ...原创 2021-08-12 15:28:03 · 95 阅读 · 0 评论 -
什么是栈以及用数组实现一个栈-JAVA
虽然栈操作看起来比数组要简单的多,但对于计算机逻辑来说是非常重要的我们在执行程序的的时候,可能会如下列伪代码一样在方法1里调用方法2,在方法2里调用方法3,执行完毕后一层一层的返回,这就是借助程序调用的系统栈来实现的public void function1(){ System.out.println(function2());}public Integer function2(){ return function3();}public Integer function3...原创 2021-08-11 14:37:39 · 119 阅读 · 0 评论 -
简单的时间复杂度分析
n是数据规模,O是渐进时间复杂度,描述的是n趋近于无穷的时候的算法用时,所以忽略常数,毕竟在无穷的面前常数可以忽略不计。O(1):算法运行时间是一个常数与数据规模无关O(n):算法运行时间与数据规模是线性关系O(lgn):O(nlogn):O(n^2):算法运行时间与数据规模是平方关系下图第三个算法在数据量小的时候效率高于第二个算法的效率,但是在对复杂度分析时数据量n是趋近于无穷的,所以前两个算法都比第三个算法的效率高。可以利用很多高阶算法的常数比较小的特性,将较小的数据量传给他,这...原创 2021-08-09 15:17:49 · 240 阅读 · 0 评论 -
JAVA-实现动态数组
数组最大的优点︰快速查询。scores[2]。数组最好应用于“索引有语意”的情况,但是如果索引比较长就还是不要用数组了,比如身份证号,太长了。Java提供给我们的数组是静态数组,大小在一开始就定下来了,所以我们要创建一个动态数组,来满足我们的需求。其实原理挺简单,初次创建的时候赋予一个初始大小,当容量不够用时进行扩容,下列代码最关键的是resize方法public class Array<E> { private E[] data; private Int...原创 2021-08-09 15:15:24 · 269 阅读 · 0 评论