二叉树 Binary Tree:
1.特点:
- 一种非线性数据结构,代表“祖先”与“后代”之间的派生关系
- 二叉树的基本单元是节点,每个节点至少包含
值
、左子节点引用
和右子节点引用
- 二叉树中,除叶节点外,其他所有节点都包含子节点和非空子树
2.概念:
名词 | 解释 |
---|---|
根节点(root node) | 位于二叉树顶层的节点,没有父节点。 |
叶节点(leaf node) | 没有子节点的节点,其两个指针均指向 None 。 |
边(edge) | 连接两个节点的线段,即节点引用(指针)。 |
二叉树的高度(height) | 从根节点到最远叶节点所经过的边的数量。 |
节点所在的层(level) | 从顶至底递增,根节点所在层为 1 。 |
节点的度(degree) | 节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。 |
节点的深度(depth) | 从根节点到该节点所经过的边的数量。 |
节点的高度(height) | 从距离该节点最远的叶节点到该节点所经过的边的数量。 |
- 图解:
3.常见二叉树类型:
完美二叉树/满二叉树:
- 特点:
- 所有层的节点都被完全填满
- 叶节点的度为0,其余所有节点的度都为2
完全二叉树:
- 特点:
- 只有最底层的节点未被填满,且最底层节点尽量
靠左填充
- 只有最底层的节点未被填满,且最底层节点尽量
完满二叉树:
- 特点:
- 除了叶节点之外,其余
所有节点都有两个子节点
- 除了叶节点之外,其余
平衡二叉树:
- 特点:
- 任意节点的
左子树和右子树的高度之差
的绝对值
不超过1
- 任意节点的
4.二叉树的遍历:
层序遍历:
- 遍历逻辑:从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点(类比队列,一般用队列实现)
- 属于广度优先遍历,也称
广度优先搜索
(breadth-first search,BFS
)
前序、中序、后序遍历:
- 遍历逻辑:从顶部到底部逐层遍历二叉树,先走到尽头,再回溯继续(类比递归,一般用递归方式实现)
- 前序、中序、后序指的是根的打印顺序:根左右、左根右、左右根
- 都属于深度优先遍历,也称
深度优先搜索
(depth-first search,DFS
)
5.二叉搜索树(节点值有序):
- 特点:
- 对于根节点,
左子树中所有节点的值
<根节点的值
<右子树中所有节点的值
(有序特性
) - 任意节点的左、右子树也是二叉搜索树,即同样满足条件 1
- 对于根节点,
- 二叉搜索树的查找操作与二分查找算法的工作原理一致,都是每轮排除一半情况。循环次数最多为二叉树的高度,当二叉树平衡时,时间复杂度为O(logn)
- 二叉搜索树不允许存在重复节点,否则将违反其定义
二叉搜索树的中序遍历的结果序列是升序的
- 常见操作:
- 查找节点:
- 比较待查找值与节点值;查找值小,则继续左子树;查找值大,则继续右子树。知道值匹配或者到达叶子节点
- 插入节点:
- 先查找到具体位置,插入到该位置(修改该位置的父节点指针,指向新节点)
- 删除节点:
- 删除节点为叶子节点,度为0,可以直接删除
- 删除节点为非叶子节点:
- 度为1,用待删除节点的唯一子节点替换掉待删除节点
- 度为2,用该节点的
右子树的最小节点
或左子树的最大节点
(该节点一定是叶子节点),替换自己- 右子树的最小节点:中序遍历的下一个节点
- 左子树的最小节点:中序遍历的最后一个节点
- 查找节点: