目录
- 一、概述
- 1.数据结构和算法
- 2.树
- 二、内容
- 树
- 二叉树
- 二叉查找树
- AVL树
- 红黑树
- B树
- B+树
- 大顶堆或小顶堆
- 三、产出
一、概述
1.数据结构和算法
什么是数据结构?数据之间的关系,或者说数据的组织结构。
数据之间的关系或组织结构,逻辑上分为线性、树、图和集合四种结构,在计算机上落地实现的时候需要借助于物理存储结构——顺序存储或链式存储。
物理结构:顺序存储或链式存储,每一种逻辑结构都可以借助于不同的物理存储结构来实现,例如链表一般借助于不需要连续内存的链式存储来实现,静态链表则借助于需要连续内存的数组来实现;常见的二叉树、自平衡二叉树等通常都借助于链式存储来实现,但是大顶堆或小顶堆则一般借助于数组来实现;Java的hashmap,逻辑结构是一个KV map,但是底层实现既有顺序存储也有链式存储。
逻辑结构:
- 线性:数据之间的关系是前驱和后继,常见链表、栈、队列、串
- 树:节点之间是父、子、兄弟的层级关系,常见二叉树、二叉查找树、AVL、红黑树、B树、B+树、大顶堆或小顶堆
- 图:图中的每一个顶点和其他顶点可以有任意关系,常见有向图和无向图
- 集合:集合中的每一个元素和其他元素都没有关系,常见Set
什么是算法?解决问题的步骤,在数据结构中,即实现数据逻辑关系或组织结构的步骤。
一般从两个角度衡量算法的效率,即时间复杂度和空间复杂度,如果是排序算法,还要考虑排序算法的稳定性。
排序算法的稳定性:如果A=B,排序前A在B的前面,排序后A还在B的前面,那么就说这个排序算法是稳定的。
2.树
树是具有层级关系的节点的集合,节点之间是父、子、兄弟的层级关系。
节点的度和阶:
- 度:节点的度描述的是节点当前拥有的孩子数量;
- 阶:节点的阶描述的是允许节点拥有孩子的最大数量;
举个例子:对于二叉树而言,一个节点最多允许拥有两个孩子,所以二叉树中每一个节点的阶都是2;但是对于某一个节点而言,该节点的度可以是0、1、2,如果是非叶子节点则度为1或2,如果是叶子节点,则度为0。
深度和高度:根深叶高
- 深度:某一个节点的深度,是指根节点到该节点的边数或层次,树的深度是指根节点到叶节点的最大边数或层次;
- 高度:某一个节点的高度,是指将该节点看作子树根节点到叶节点的最大边数或层次;
- 树的高度值通常等于树的深度值,但是节点的深度值和高度值则通常不同,区别见下图;
特别的,数据结构中规定空树的高度为-1,由此可知:
- 对于节点J而言,J本身就是一个叶子节点,所以子树J是一颗单节点子树,J到J自身的边数或层次为0,所以节点J的高度为0;
- J节点的左右孩子都为null,空树的高度为-1,所以节点J的左右孩子的高度都为-1;
节点的深度和高度一定要讨论清楚,因为后面AVL树需要用到这些概念。
二、内容
- 树:树是具有层级关系的节点的集合,节点之间是父、子、兄弟的层级关系;
- 二叉树
- 首先是一棵树
- 其次对于树中的每一个节点,其最多有两个孩子,即节点的阶为2
- 二叉查找树
- 二叉查找树首先是一颗二叉树
- 其次对于树中的任意一个节点,该节点的值大于左孩子小于右孩子
- AVL
- AVL树属于自平衡二叉树
- AVL树首先是一颗二叉查找树
- 其次对于树中的任意一个节点,该节点左右孩子的高度差不大于1
- AVL树通过左右孩子的高度差来保证平衡
- 红黑树
- 红黑树和AVL树都属于自平衡二叉树
- 红黑树首先是一颗二叉查找树
- 其次对于树中的任意一个节点,都具有以下五种性质:
- 不是红色就是黑色
- 如果是根节点,则是黑色
- 如果是叶节点,则是黑色(页节点是NIL节点)
- 如果该节点是红色,则它的两个孩子都是黑色
- 每个节点的深度路径上都包含相同数量的黑色节点
- 红黑树通过节点的颜色数量来保证平衡
- B树
- B树属于自平衡多路查找树
- 高扇出
- 所有的叶节点都在同一层级,即叶节点的深度都相同
- B树通过叶节点都在同一层级来保证平衡
- B+树
- AVL、红黑树、B树和B+树都属于自平衡树,不过AVL和红黑树最多只有两个孩子,属于自平衡二叉树,而B树和B+树是高扇出允许有多个孩子,属于自平衡多路查找树
- 高扇出
- 分为叶节点和索引节点,叶节点包含所有的数据,索引节点只包含索引值不包含数据
- 所有的叶节点都在同一层级,且组织成一条双向链表
- B+树通过叶节点都在同一层级来保证平衡
- 大顶堆或小顶堆
- 注意:以上一般都是通过链式存储来实现树结构,但是大顶堆或小顶堆则是通过顺序存储来实现树的层次结构(当然也可以通过链式存储来实现,不过会更复杂),所以作为一个补充来提及;
- 如果是大顶堆,则根节点是最大值;如果是小顶堆,则根节点是最小值;
- 对于大顶堆中的任意节点,该节点的值大于左右孩子,不要求左孩子小于右孩子,只要求父节点的值大于两个孩子;
- 对于小顶堆中的任意节点,该节点的值小于左右孩子,不要求左孩子小于右孩子,只要求父节点的值小于两个孩子;
三、产出
参考资料:
- 《算法导论》
- 《数据结构与算法分析:Java语言描述》
- 《大话数据结构》