1、树
1、什么是平衡二叉树
它的左右子树的高度差不超过1,左右两个子树都是一棵平衡二叉树。平衡二叉树保证了二叉树的高度不会过高,能够较好地支持常见的二叉树操作,如插入、删除、查找等。
平衡二叉树的常用实现方法有红黑树、AVL树、替罪羊树、Treap、伸展树等。
2、B+树和B树的区别
B树(B-Tree)和B+树(B+ Tree)是常见的平衡查找树
-
B树:B树的节点中既包含键值,也包含对应的数据,就是在叶子节点上同时存储键值和数据。
-
B+树:B+树的节点中只包含键值,对应的数据存储在叶子节点上,所有叶子节点之间都有一个链指针。
- 应用场景:
- B树适用于磁盘存储,能够快速定位到具体的数据。因此,在 索引比较短(比如整型)的情况下,B树的高度会相对较低,可以减少磁盘IO。
- B+树适用于内存存储和数据库索引。由于B+树的叶子节点之间使用链表连接,在范围查询和顺序遍历时具有较好的性能。
3、什么是红黑树
而红黑树是一种自平衡的二叉树,平衡树的特点就是左右子树的高度差不会超过一,他的高度比较小,有比较快的查询和增删速度。他的一个时间复杂度是O(logn)
4、红黑树跟普通平衡树的区别
红黑树是通过对节点进行着色和旋转操作来保持平衡的,而平衡二叉树是通过调整节点的位置来保持平衡的。
红黑树相对于平衡二叉树来说,插入和删除的平均时间复杂度更低,但是红黑树的平衡维护操作相对复杂一些。
5、树的插入原理
在二叉树中插入节点时,首先判断树是否为空,如果为空,则将新节点作为根节点。如果树不为空,则从根节点开始搜索插入位置。
在搜索插入位置的过程中,比较新节点的值与当前节点的值,如果新节点的值较小,则继续在当前节点的左子树中搜索;如果新节点的值较大,则继续在当前节点的右子树中搜索。
重复以上步骤,直到找到一个空位置,将新节点插入该位置。
2、常见数据结构
数组、栈和队列、链表、集合、各种树,图、堆、哈希表
3、集合和数组、转换
数组可以存储基本数据类型和引用类型,不支持泛型,大小是固定的,集合只能存储引用类型,支持泛型,大小可以改变。而且集合提供了很多丰富的功能,比如Set不允许重复元素,map以键值对存储数据
遍历方式:
- 数组可以使用for循环或增强for循环进行遍历。
- 集合提供了多种遍历方式,包括Iterator迭代器、增强for循环、Stream API等。
ArrayList到数组:String[] arr = list.toArray(new String[list.size()]); //list为集合
数组到ArrayList:ArrayList list = new ArrayList<>(Arrays.asList(arr));
4、链表和数组的区别
数组他的内存空间是连续的,长度固定,可以通过索引来直接访问,所以他的查询速度比较快,对应的删除和插入,因为要移动数组中的其他元素,所以会比较慢。哈希表、栈和队列
而链表他是一种动态的数据结构,由一个一个节点组成,内存是不连续的,访问的时候要从头开始一个一个的遍历,相对来说比较慢,删除和新增的时候只需要修改几个节点就行,所以一般比数组快。栈和队列
5、队列和栈的区别
- 队列是一种先进先出的数据结构,即最先入队的元素最先出队。队列通常使用链表或数组来存储数据,新元素被添加到队尾,而访问或删除元素时从队头进行操作。
- 栈是一种后进先出的数据结构,即最后压入的元素最先弹出。栈通常也使用链表或数组来存储数据,新元素被压入栈顶,而访问或删除元素时也从栈顶进行操作。
- 队列常用于实现BFS(广度优先搜索)算法、任务调度和消息传递等场景,其中先进先出的特性很重要。
- 栈常用于实现DFS(深度优先搜索)算法、递归函数的调用和表达式求值等场景,其中后进先出的特性很重要
6、栈堆溢出一般有什么场景
栈溢出最常见的就是数组越界了,其他还有就是代码写得太复杂,也不能说复杂吧,就比如递归调用层次太多也会造成栈溢出。
而堆溢出的话,我遇到过的是有两个类,a类new了一个b类的对象,b类又new了一个a类的对象,就这样反反复复的不断创建,最终导致堆溢出。
7、int和Integer
首先一个是基本数据类型,一个是对应的包装类,基本那个是直接存储在栈中,初始值是0,int是0,double是0.0,其他就不一一列举了(boolean是false)。而包装类他的引用放在栈中,具体的数据放在堆中,初始值为空,还提供了很多方法,基本类型只能做简单的运算。包装类型是引用的传递,基本类型是值的传递。
8、哪些数据需要初始化
final修饰的变量,还有局部变量要使用它必须初始化
成员变量无需初始化
9、堆和栈的区别
栈内存:用于存储局部变量,数据使用完,所占空间会自动释放。
堆内存:数组和对象,通过new建立的实例都存放在堆内存中。