引言
二叉树作为数据结构中的经典模型,其遍历与操作往往离不开深度优先搜索(DFS)。无论是递归还是迭代,DFS 都能帮助我们深入探索树的每一个节点,高效解决路径查找、数值计算及结构验证等问题。本文将通过六个典型 LeetCode 案例,从基础概念到代码实现,带你系统掌握 DFS 在二叉树中的应用。
一、计算布尔二叉树的值
题目链接:https://leetcode.cn/problems/evaluate-boolean-binary-tree/
思路解析
这是一个典型的递归问题。我们需要根据父节点的逻辑运算类型(0: NOT, 1: AND, 2: OR),结合左右子树的返回值来决定当前节点的值。
- 递归出口:如果当前节点是叶子节点(没有左右孩子),直接返回该节点存储的布尔值。
- 递归过程:分别获取左右子树的布尔结果,然后根据当前节点的值进行逻辑运算。
- 注意:题目保证是完整二叉树,若左孩子为空则右孩子必为空。
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool evaluateTree(TreeNode* root) {
// 叶子节点直接返回布尔值
if (!root->left) return root->val == 0 ? false : true;
// 递归获取左右子树的值
bool left = evaluateTree(root->left);
bool right = evaluateTree(root->right);
// 根据节点值判断逻辑运算
// 2 代表 OR (|), 其他情况(如 3)代表 AND (&)
return root->val == 2 ? (left | right) : (left & right);
}
};








