1. 二叉树基础概念与核心理论
二叉树是每个节点最多有两个子节点的树结构,在算法领域有着举足轻重的地位。我第一次接触二叉树时,被它的简洁性和强大表达能力所震撼——它既能高效处理数据,又能清晰展现数据间的层级关系。
1.1 二叉树的基本类型
满二叉树:每个节点都有0或2个子节点,且所有叶子节点都在同一层。想象一棵完美对称的树,每一层都被节点完全填满。
完全二叉树:除了最后一层,其他层节点数都达到最大值,且最后一层节点都集中在左侧。这种结构在堆(Heap)实现中特别常见。
二叉搜索树(BST):左子树所有节点值小于根节点,右子树所有节点值大于根节点。这种特性使得查找效率能达到O(log n)。
平衡二叉搜索树(AVL树):在BST基础上,保证左右子树高度差不超过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。这种方式节省指针空间,适合存储密集树结构。
1.3 二叉树的遍历方式
深度优先遍历(DFS):
- 前序遍历:根→左→右
- 中序遍历:左→根→右
- 后序遍历:左→右→根
广度优先遍历(BFS):
- 层序遍历:按层次从上到下,每层从左到右
提示:前中后序的命名依据的是根节点的访问顺序。这个记忆技巧帮我度过了初学时的困惑期。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归遍历的实现与核心要点
递归是理解二叉树最自然的方式,它完美匹配了树的自相似特性。但递归也是许多初学者的"噩梦",我曾经花了整整一周才真正理解递归的执行流程。
2.1 递归三要素
-
确定参数和返回值:
需要处理当前节点和存储结果的容器。通常返回值是void,结果通过引用参数传递。 -
确定终止条件:
当节点为nullptr时返回,这是递归的出口。 -
确定单层逻辑:
根据遍历顺序决定访问节点值、递归左子树、递归右子树的顺序。
2.2 前序遍历递归实现
cpp复制void preorder(TreeNode* root, vector<int>& res) {
if(!root) return;
res.push_back(root->val); // 中
preorder(root->left, res); // 左
preorder(root->right, res);// 右
}
2.3 中序遍历递归实现
c复制
