1. 二叉树理论基础与核心概念
二叉树是每个节点最多有两个子节点的树结构,在算法领域应用极为广泛。理解其底层原理对掌握高效算法至关重要。
1.1 二叉树的种类与特性
在实际编码中,我们最常遇到以下几种二叉树类型:
- 满二叉树:每个节点都有0或2个子节点,且所有叶子节点都在同一层
- 完全二叉树:除最后一层外,其余层都达到最大节点数,且最后一层节点靠左排列
- 二叉搜索树(BST):左子树所有节点值小于根节点,右子树所有节点值大于根节点
- 平衡二叉搜索树(AVL):在BST基础上,保证左右子树高度差不超过1
特别提示:C++中的map、set等容器底层采用红黑树(一种自平衡二叉搜索树)实现,因此其插入、删除、查找的时间复杂度稳定在O(log n)。而unordered_map和unordered_set则基于哈希表实现,平均时间复杂度为O(1)。
1.2 二叉树的存储方式
链式存储(最常用)
cpp复制struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
这种存储方式直观清晰,每个节点通过指针连接子节点。优点是插入删除灵活,缺点是空间利用率稍低(需要存储指针)。
顺序存储(数组实现)
对于完全二叉树,可以使用数组存储:
- 下标为i的节点,其左子节点下标为2i+1
- 右子节点下标为2i+2
- 父节点下标为(i-1)/2
这种存储方式节省指针空间,适合存储完全二叉树,但对非完全二叉树会造成空间浪费。
1.3 二叉树的遍历方式
深度优先遍历(DFS)
- 前序遍历:根→左→右
- 中序遍历:左→根→右
- 后序遍历:左→右→根
广度优先遍历(BFS)
- 层序遍历:按层次从上到下,每层从左到右
不同遍历方式的选择取决于具体应用场景。例如前序遍历适合复制树结构,中序遍历适合BST获取有序序列,层序遍历适合计算树的高度等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归遍历的实现与原理
递归是解决树问题的天然利器,因其完美匹配树的递归定义。掌握递归三要素是写出正确递归代码的关键。
2.1 递归三要素详解
-
确定递归函数的参数和返回值
- 参数:当前节点指针和存储结果的容器
- 返回值:通常为void,通过引用修改结果容器
-
确定终止条件
- 当前节点为空时返回
- 这是防止无限递归的关键
-
确定单层递归逻辑
- 根据遍历顺序决定访问节点的时机
- 必须保证左右子树的递归调用
2.2 前序遍历实现
cpp复制
