文章目录
树和二叉树
树
- 树和图都是典型的非线性结构
- 定义:
树是n节点的有限集。树是n(n=>0)个节点的有限集。 n=0时成为空树。在任意一颗非空树中:
(1)有且仅有一个称为根的节点;
(2)当n>0时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、T3、Tm,其中每个节点又是一棵树,并且称为根的子树。 - 叶子节点(leaf): 没有孩子的节点
- 遍历
- 抽象方式
- 深度优先(
DFS
), todo: golang代码- 前序遍历: 根->左
子树
->右子树
, leetcode题目: 二叉树的前序遍历 - 中序遍历: 左
子树
->根->右子树
,leetcode题目: 二叉树的中序遍历 - 后序遍历:左
子树
->右子树
->根,leetcode题目: 二叉树的后序遍历
- 前序遍历: 根->左
- 广度优先(
BFS
): 层序遍历,leetcode题目: 二叉树的层序遍历
- 深度优先(
- 代码实现的方式:
- 递归
- 栈
- 队列
- 迭代
- 抽象方式
二叉树( binary tree)
- 定义:
二叉树(binary tree)是树的一种特殊形式.二叉,顾名思义,这种树的每个节点
最多有两个孩子节点
.注意,这里是最多有2个,也有可能只有一个,或者没有. - 存储形式
-
链式结构
-
数组
- 数组存储的特性:
- 如果父节点的下标是parent,那么他左孩子节点的下标就是2parent+1, 右孩子节点的下标就是2parent+2
- 对于稀疏的二叉树来说,用数组表示比较浪费空间
- 什么样的树用数组来表示比较合适:
二叉堆
- 数组存储的特性:
-
满二叉树(也叫完美二叉树:perfect binary tree)
- 定义:
一个二叉树的所有
非叶子节点
都有2个孩子,并且所有的叶子节点
都在同一层 - 图形
完全二叉树(complete binary tree)
-
定义:
对于一个有n个节点的二叉树,按层级顺序编号,则所有的节点编号为1到n,如果这个树所有节点和同样深度的满二叉树的编号从1到n的节点位置相同,则这个二叉树为完全二叉树
另一种定义方式: 只有最底层的节点未被填满,且最底层节点尽量靠左填充。 -
图形:
-
面试题:
完满二叉树( full binary tree)
除了叶节点之外,其余所有节点都有两个子节点
二叉搜索树(binary search tree)
- 也叫
二叉排序树
- 定义:
在二叉树的基础上增加了几个条件:
1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3.任意结点的左、右子树也分别为二叉搜索树。 - 作用: 方便查找
- 图形:
- 算法时间复杂度
- 对于一个
节点分布相对均衡
的二叉查找树来说,如果节点总数是n,那么搜索节点的时间复杂度就是O(lgn)
,和树的深度是一样的 - 如果
分布不均衡
那么搜索节点的时间复杂度就是O(n)
,如下图
- 对于一个
二叉堆
- 定义:
本质是一种
完全二叉树
维基百科:二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。 - 和
二叉搜索树
的比较和
二叉搜索树
比较起来, 只要求父节点比他的孩子都大(极大堆
)或小(极小堆
) - 类型:
-
最大堆: 任何一个父节点的值都大于或等于他左,右孩子节点的值
-
最小堆: 任何一个父节点的值都小于或等于他左,右孩子节点的值
-
- 自我调整
- 插入节点,时间复杂度:O(nlgn)
- 删除节点,时间复杂度:O(nlgn)
- 构建节点,时间复杂度:O(n)
优先队列
- 特定: 不再遵循队列的先进先出(FIFO),而是分两种情况:
- 最大优先队列: 无论入队的顺序如何,都是当前最大的元素优先出队
- 实现: 最大堆
- 最小优先队列: 无论入队的顺序如何,都是当前最小的元素优先出队
- 实现: 最小堆
- 最大优先队列: 无论入队的顺序如何,都是当前最大的元素优先出队