- 博客(13)
- 收藏
- 关注
原创 AVL树--(Java)
但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。如果原来根节点拥有父亲节点,这个原来的根节点如果是父亲节点的左孩子,那么新的根节点改为父亲节点的左孩子反之亦是,最后把原来的根节点和新的根节点平衡因子修改为0,这样就完成了一次左旋操作。简单描述就是把原来根节点的右孩子结点变为新的根节点,原来的根节点变为新的根节点的左孩子。如果原来根节点的右孩子有左孩子,那它旋转后就会成为新的根节点左孩子的右孩子。
2025-08-10 15:46:02
351
原创 优先级队列 (堆) --Java
建立一个k空间大小的大根堆,入队列k次,然后循环判断数组中的k下标后面的元素与队首元素大小关系,只要比队首元素小就出队列并把这元素入队列,结束后这个k空间大小的堆就是这个数组中最小的k个数了。这个就是优先级队列的简单应用,简单粗暴的的做发就是直接创建一个优先级队列,把数组中的元素一个一个入队列,最后循环k次出队列并存到新的数组中就是想要求的最小的k个数。概念: 队列是一种先进先出的数据结构,而里面的数据可能带有优先级,出队列时让优先级高的先出队列,这时候就需要优先级队列。
2025-05-15 13:50:58
841
原创 二叉树(二)--Java
对于这棵树开始求高度,刚开始一直递归到D 其左右子树为null 返回1给B的leftHight 递归B的右子树一直到G 其左右子树为null 返回1给E的leftHight E返回1+1 给B的rightHight B的左右子树递归完毕,最大值为 2返回2+1给A的leftHight 递归右子树与上面相同 最终返回3+1,则最终结果为4。对于D k==3 递归左子树并且k-1 为B不满足条件继续递归并且k-1为A 此时k为1 则返回1 对于E F相同最后将这三个累加起来就是k为3的节点个数。
2025-04-22 23:48:55
330
原创 二叉树 ---(Java)
其中A就是根节点,B,C,D就是子节点,每一个子节点有且仅有一个前驱,如:B的前驱有且仅有A。树是一种非线性结构,有n个有限个节点组成一个具有层次关系的集合。为什么把它叫成树呢,因为它看起来就像是一个反过来的树。站在子树的角度,先序:第一个元素就是子树的根节点 后序:最后一个元素就是子树根节点。对于先序来说第一个元素就是树的根节点,后序最后一个元素就是根节点。对于中序,根节点左边的就是左子树右边的就是右子树。链式存储是通过一个一个的节点引用起来的。树的核心操作: 树的遍历。//继续拿这个图举例子。
2025-04-17 22:08:04
451
原创 数据结构——队列
出队列,先判断是否为空队列,先用一个变量记录队首元素,把head++,注意,这里删除队首元素并不是在物理意义上删除元素,而是逻辑上的删除,咱们这个循环队列区间是【head,tail),到后面tail返回来的时候再进行入队列的操作时就会把原来被删除的元素覆盖掉,记得把size--,将有效元素个数减一。假设一直在入队列,此时刚好出队列了三个元素,但是右边正好满了,这是就要把tail重新回到下标为0的这个位置,就好像第一张图一样,成为了一个环,head也是一样,那要是一直入队列怎么判断队列满了呢?
2025-02-25 16:56:26
279
原创 数据结构--栈
在IDEA中用Stack. 会发现还有很多操作,那是因为Stack继承自Vector,Vector与ArrayList相似,只不过Vector时线程安全的。push:要考虑到size超出原来初始化的范围,要扩容操作,写一个方法创造一个新的更大的数组来扩容,然后进行赋值操作并把size++pop: 判断空栈情况并抛出异常,弹出栈顶元素并记录和减容,这样栈中就不存在这个元素了。栈:栈是一种特殊的线性表,只允许在特殊的一端进行插入和删除操作,遵循先进后出的原则。进入栈就叫 入栈,拿出栈顶元素就叫出栈。
2025-02-23 14:28:14
248
原创 Java链表
任意位置删除:这里的判断与任意位置插入有所不同 当index==size()时,此时时链表的null,可以进行尾插,但是删除就不行了 逻辑就是把待删除的前一个元素直接指向带删除元素的后一个,后一个的prev指向待删除元素的前一个就行。尾插:要先找到链表的尾巴,想到利用循环用tail来记录尾巴,tail.next指向新的节点,到需要注意的是,循环的条件尾巴不能是空的,因此我们要判断头节点是否为空的情况。答案是不用的,因为原来的没有被指向了,直接会被GC回收掉,那他的prev也随之消失了。
2025-02-22 14:44:01
493
原创 ArrayList和顺序表
5.与vector不用,ArrayList不是线程安全的,在单线程下可以使用,在多线程可以选择vector,CopyOnWriteArrayList。常见的线性表有顺序表,链表,栈,队列........顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,完成增删改查。6.ArrayList底层是一段连续的空间,可以动态扩容,是一个动态类型的顺序表。在集合框架中,ArrayList是一个普通的类,实现了List接口。2.迭代器是设计模式的一种,后续容器接触多了再给大家铺垫。
2025-01-24 19:01:36
287
原创 抽象类和接口
核心区别:抽象类中可以有普通属性和普通方法,可以被子类直接使用而接口不能有普通方法,子类必须重写抽象方法,并且一个子类只能继承一个抽象类,但是一个子类可以实现多个接口。抽象类的场景就是上面的代码,父类不完成实际的工作,让子类去完成,但是误用了父类的方法编译器是不会报错的,但抽象类不允许被实例化,让我们一下就能看出来哪里有问题。Clonable就是浅拷贝,它把person里的对象money单纯的拷贝了,拷贝出来的和原来的地址相同,都指向Money,所以有一个改了,两个就都被改了。这样设计有什么好处呢?
2025-01-17 10:01:57
1589
原创 继承和多态
在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执 行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分。事实上,编译器编译的时候看到的animal是父类的引用,尝试在父类中寻找meow方法,没找到,就报错了,编译器不知道animal真实类型是啥,识别是JVM干的事,JVM能知道animal是指向Cat类型的,此时调用animal.eat就会触发动态绑定,找到对应子类匹配的方法来执行。那能否将这些共性抽取出来?
2025-01-07 19:36:26
1105
原创 类和对象(Java)
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。4.打个比方,类实例化出的对象就像根据图纸设计出来的房子,类就是设计图,只设计出有什么东西,但是并没有实体的建筑存在,实例化出的对象才能实际存储数据,占用物理空间。this引用指向当前对象,在成员方法中所有成员变量的操作,都是通过该引用去访问,只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。而类和对象阶段,主要研究封装特性,简单来说就是套壳屏蔽细节。
2025-01-04 21:04:39
1438
原创 初识Java(2)
boolen型变量只有true和false两种取值,与int不能转换,在C语言中用0表示假,非0表示真,而在Java中不存在这样的说法。计算机中字符本质上是一个整数,C语言中用ASCII表示字符,java用Unicode表示字符,一个字符占两个字节,表示的种类更多。4.double类型的内存存储遵循IEEE 754标准,尝试是用有限的内存空间表示可能无限的小数,(2)整型常量:程序中直接写的(没有小数点)如100,200,6;(4)字符常量:由‘’括起来的字符,如‘A’,‘6’;
2024-12-27 12:24:44
427
原创 初识Java
例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器 提供商指定的其他大小。Java是一门半编译型,半翻译型的语言,先通过javac编译程序把源文件进行编译,编译形成的.class文件是由字节码组成的与平台无关的面向JVM的文件,最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。在Java的世界里,一切皆对象。Java的面向对象特性与c++旗鼓相当,不同于用的是用到的是更简单的。
2024-12-26 21:07:01
315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅