二叉树深度优先搜索:核心原理与实战案例
搜索算法基础
在图论和数据结构中,广度优先搜索(BFS)和深度优先搜索(DFS)是最基础的遍历方式。虽然形式上都是遍历,但目的不同:BFS 逐层扩展,适合寻找最短路径;DFS 则沿着一条路径深入到底,遇到死胡同再回溯,更适合探索所有可能性或结构分析。
暴力搜索通常基于 DFS 实现,通过枚举所有情况来寻找结果。虽然效率可能较低,但在数据规模较小或缺乏明显规律时,它是最直接的解决方案。
回溯与剪枝
回溯算法本质上是 DFS 的一种应用。想象你在走迷宫,从起点出发,沿着当前路径一直走。如果走到死胡同,就退回到上一个路口,尝试另一条路。这就是回溯。
在实际应用中,我们往往不需要遍历所有路径。如果在搜索过程中发现当前分支不可能产生最优解,可以直接舍弃,这个过程称为'剪枝'。这能显著提升算法效率。
实战例题解析
1. 计算布尔二叉树的值
题目给定一棵完整二叉树,叶子节点存储真值(0 或 1),非叶子节点存储逻辑运算符(2 代表 OR,3 代表 AND)。我们需要自底向上计算根节点的布尔值。
思路: 这是一个典型的后序遍历问题。递归处理左右子树,拿到子树的布尔值后,再根据当前节点的值进行运算。当遇到叶子节点时,直接返回其值作为递归出口。
/**
* Definition for a binary tree node.
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public boolean evaluateTree(TreeNode root) {
// 叶子节点,直接返回布尔值
if (root.left == null) {
return root.val == 1;
}
// 递归获取左右子树的值
boolean left = evaluateTree(root.left);
boolean right = evaluateTree(root.right);
// 根据节点类型进行逻辑运算
return root.val == ? (left || right) : (left && right);
}
}


