深度优先遍历简介
深度优先遍历(DFS,Depth First Traversal)是处理树或图结构时的核心算法之一。它的策略是尽可能深地搜索树的分支,直到一条路径上的所有节点都被访问完毕,然后回溯到上一层继续寻找其他路径。
在二叉树中,常见的 DFS 形式包括前序、中序和后序遍历。由于树的定义本身具有递归性质,使用递归实现这三种遍历不仅逻辑清晰,代码也非常简洁。三者唯一的区别在于访问根节点的时机不同。在实际解题时,选择合适的遍历顺序往往能事半功倍。
6. 计算布尔二叉树的值
题目描述
给定一个满二叉树,其中叶子节点的值代表布尔值(0 为 false,1 为 true),非叶子节点的值代表逻辑运算符(2 为 OR,3 为 AND)。要求返回根节点的计算结果。

解法思路
这道题非常适合用递归来解决。我们可以把问题拆解为子问题:
- 终止条件:当遇到叶子节点时,直接返回其存储的布尔值(0 或 1)。
- 递归步骤:对于非叶子节点,先递归计算左右子树的值。
- 合并结果:根据当前节点的类型(OR 或 AND),结合左右子树的返回值得出当前节点的结果。
这里有一个小技巧:为了简化代码,我们可以直接在递归过程中修改子节点的值来传递中间结果。虽然这会改变原树的结构,但在算法竞赛或 LeetCode 环境中通常是允许的,且能减少额外空间开销。
C++ 代码实现
/**
* 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 == nullptr && root->right == nullptr) {
return root->val;
}
// 递归计算左右子树的值,并更新子节点的值以复用空间
root->left->val = evaluateTree(root->left);
root->right->val = evaluateTree(root->right);
// 根据当前节点类型返回运算结果:2 为 OR,3 为 AND
return root->val == ? (root->left->val || root->right->val) : (root->left->val && root->right->val);
}
};



