1. 数组(Array)
定义:数组是一种 线性表 数据结构,它用一组 连续的内存空间 存储一组具有 相同类型 的数据。
Java中 基本数据类型数组 的存储格式:
int arr[] = new int[3];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
Java中 对象数组 的存储格式:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
}
Person arr[] = new Person[3];
arr[0] = new Person("Peter");
arr[1] = new Person("Leo");
arr[2] = new Person("Cina");
2. 链表(Linked List)
定义:链表由一系列节点组成,每个节点除存储数据本身外,还需要额外存储下一个节点的地址。
3. 栈(Stack)
定义:从操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端(也就是栈顶)插入和删除数据。
特性:先进后出。
4. 队列(Queue)
定义:从操作特性上来看,队列也是一种“操作受限”的线性表,其限制是仅允许在表的一端(队头)进行插入,而在表的另一端(队尾)进行删除。
特性:先进先出。
5. 树(Tree)
5.1 树的高度、深度、层数
5.2 二叉树
定义:每个节点最多有2个子节点,分别是左子节点和右子节点。二叉树并不要求每个节点都必须要有两个子节点。
二叉树链式存储方式的Java代码实现:
public class Node {
public int val;
public Node left;
public Node right;
}
二叉树基于数组的顺序存储方式实现:
用数组来存储所有的节点。对于节点之间的父子关系,通过数组下标计算得到。如果节点 X 存储在数组中下标为 i 位置,那么, 下标为 2i 的位置存储的就是它的左叶子节点,下标为 2i+1 的位置存储的就是它的右叶子节点。(为了方便计算,根节点一般会用下标为1的位置存储)
5.3 满二叉树
定义:除子节点外,每个节点都有左右两个子节点,并且子节点都在最底层的二叉树。
5.4 完全二叉树
定义:叶子节点只在最底层和倒数第二层,并且最底层的叶子节点都 靠左排列 的二叉树。
- 完全二叉树 基于数组的顺序存储方式仅仅“浪费”了一个下标为0的数组存储空间。
-
如果是 非完全二叉树,基于数组的顺序存储方式,会“浪费”比较多的数组存储空间。
5.5 二叉查找树:
定义:二叉查找树中的任意一个节点,其左子树中每个节点的值都要小于这个节点的值,而右子树中每个节点的值都要大于这个节点的值。 二叉查找树也被称为二叉搜索树,可以实现快速查找、插入、删除操作。
5.6 平衡二叉树
定义:二叉树中任意一个节点的左右子树的高度相差不能大于1。
5.7 红黑树
定义:
- 红黑树是特殊的二叉查找树
- 节点被标记为 红色 或者 黑色。
- 根节点是黑色。
- 每个叶子节点都是 黑色的 空节点,也就是说,叶子节点不存储数据。
- 任何上下相邻的节点不能同时为红色,也就是说,红色节点被黑色节点隔开。
- 每个节点到其 叶子节点 的所有路径,都包含相同数目的黑色节点。
class RedBlackTreeNode {
public int val;
public RedBlackTreeNode left;
public RedBlackTreeNode right;
// 节点的颜色属性,设置true表示红色
public boolean color;
// 节点的parent属性
public RedBlackTreeNode parent;
}
5.8 B+树
定义:
- B+树由m叉查找树和有序双向链表组合构成,m>=2。
- 每个节点至多有m个子节点,非根节点至少有m/2个子节点,根节点至少有2个子节点。
- 有k个子节点的节点必有k个关键字值。
- 所有节点内的关键字值按从小到大顺序链接。
- 非叶子节点只保存关键字值,叶子节点既保存关键字值也保存数据行的地址信息。
- 非叶子节点的关键字值都存在于子节点中,在子节点元素中是最大(或最小)元素。
- 所有叶子节点的高度一致。