1. 二叉树算法实战:从基础到进阶
在算法面试和竞赛中,二叉树相关题目占据了重要地位。掌握二叉树的遍历、剪枝和回溯技巧,不仅能帮助我们高效解决特定问题,更能培养递归思维和算法设计能力。本文将深入解析5道经典二叉树题目,揭示其中的算法原理和实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 计算布尔二叉树的值
2.1 问题分析与递归设计
给定一个特殊的布尔二叉树,其中叶子节点值为0或1,非叶子节点值为2或3。2代表逻辑或(OR),3代表逻辑与(AND)。我们需要递归计算整棵树的值。
递归设计的核心在于明确:
- 递归终止条件:当遇到叶子节点时,直接返回其值
- 递归过程:先计算左右子树的值,再根据当前节点类型进行运算
cpp复制class Solution {
public:
bool evaluateTree(TreeNode* root) {
if(!root->left && !root->right) return root->val;
bool left = evaluateTree(root->left);
bool right = evaluateTree(root->right);
return root->val == 2 ? left || right : left && right;
}
};
关键点:递归函数可以看作黑盒,只需明确其输入输出,不必纠结内部实现。这种抽象思维是解决树问题的关键。
2.2 时间复杂度分析
该算法采用后序遍历,每个节点仅访问一次,因此时间复杂度为O(n),n为节点数。空间复杂度取决于递归深度,最坏情况下为O(n)。
3. 根到叶节点数字之和
3.1 两种DFS实现对比
题目要求计算从根到所有叶子节点路径组成的数字之和。我们分析两种实现方式:
- 返回值传递法:
cpp复制class Solution {
public:
int dfs(TreeNode* root, int presum) {
int sum = presum * 10 + root->val;
if(!root->left && !root->right) retu
