算法
二叉树
二叉树结点的定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
}; //分号记得
有关二叉树的一些概念
- 根节点:位于二叉树顶层的节点,没有父节点。
- 叶节点:没有子节点,两个左右子节点的指针为空。
- 节点的层:从顶到底递增,根节点所在层为1;
- 节点的度:节点的子节点的数量。二叉树中,度的范围是0,1,2。
- 边:连接两个节点的线段。即节点指针。
- 二叉树的高度:从根节点到最远叶节点所经过的边的数量。
- 节点的深度:从根节点到该节点所经过的边的数量。
- 节点的高度:从最远叶节点到该节点所经过的边的数量。
二叉树的类型
- 完美二叉树(满二叉树):每一层都填满了节点,并且最底层节点的度为0,其余所有层的度为2,这个填满指的是节点都有左右子节点。如果树的高度为h(节点计数),则节点总数为2^(h)-1。典型的细胞分裂现象。
- 完全二叉树:除了最底层节点没有被填满外,其他所有层节点被填满。且最底层节点靠左填充。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。
- 完满二叉树:除了叶子结点外,其余所有节点都有两个子节点。
- 平衡二叉树:任意节点的左子树和右子树的高度差的绝对值不超过1。
- 二叉搜索树:它是一个有序树,若左子树不为空,则左子树上所有节点的值小于根节点的值。若右子树不为空,则右子树上所有节点的值大于根节点的值。并且它的左右子树也分别为二叉搜索树。
- 平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,平衡二叉树和二叉搜索树的结合体。
- 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
二叉树的存储方式
二叉树有链式存储和顺序存储两种方式。
链式存储的方式是用指针,而顺序存储的方式使用数组。顺序存储的元素在内存是连续分布的。而链式存储的元素是通过指针把存放在各个地址的节点串联起来。
链式存储是比较熟悉也是比较常用的方式。对于数组存储,是对二叉树进行从上到下从左到右从0开始编号,也就是进行层序遍历。那么第0个节点就存放在数组中下表为0的位置,这样以此类推。
顺序存储时(数组存储),遍历二叉树的方式是父节点的数组下标是i,左孩子就是2i+1,右孩子是2i+2。
二叉树的遍历方式
- 深度优先遍历:前序遍历、中序遍历、后序遍历。
- 广度优先遍历:层次遍历。
在需要比较大小,求最小值时,定义一个最大值(INT_MAX or LONG_MAX)。求最大值时,定一个最小值(INT_MIN or LONG_MIN)。
十大排序
链表
双向链表
双向链表是链表的一种,它的每个节点中有两个指针,一个前指针,指向它的前驱节点,一个后指针,指向它的后继节点。
循环双向链表(双向循环链表)
循环双向链表是在双向链表的基础上,使得首节点的前指针指向尾节点,尾结点的后指针指向首节点。也就是通过每个节点的前指针或者后指针都能够循环访问整个链表。
单向链表
每个节点只有一个指针指向它的下一个节点。
循环单向链表(单向循环链表)
在单链表的基础上,让尾结点的指针指向首节点。单链表任意一个节点的访问都必须从首节点开始才能访问到。但循环单向链表就不要这样了,可以从任意节点出发,都能访问到任意节点。

浙公网安备 33010602011771号