深度优先遍历简介
在树或图结构中,深度优先遍历(DFS)是最基础的遍历方式之一。它的核心在于'一条路走到黑',直到无法继续才回溯。对于二叉树而言,前序、中序和后序遍历本质上都是 DFS 的不同变体,区别仅在于访问根节点的时机。由于树本身具有递归定义的特性,用递归来实现这些遍历往往最直观且代码简洁。
1. 计算布尔二叉树的值
题目来源: LeetCode 2331

解题思路
这道题可以看作是一个自底向上的求值过程。我们需要明确两个关键点:
- 叶子节点:值为 0 或 1,分别代表 false 和 true。
- 内部节点:值为 2 或 3,分别代表 OR (||) 和 AND (&&) 运算。
递归的终止条件很明确:当遇到叶子节点时,直接返回其布尔值。对于非叶子节点,我们先递归获取左右子树的值,然后根据当前节点的类型进行逻辑运算。这里有个细节,我们在递归返回后可以直接利用子节点的值来更新当前节点的计算结果,这样逻辑非常清晰。
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;
}
// 递归获取左右子树的值
bool leftVal = evaluateTree(root->left);
bool rightVal = evaluateTree(root->right);
// 根据节点类型返回运算结果
// 2 代表 OR,3 代表 AND
return root->val == 2 ? (leftVal || rightVal) : (leftVal && rightVal);
}
};



