二叉树中的「好节点」巧解:递归算法帮你轻松过关
2024-03-09 15:47:06
掌握递归算法:巧解 LeetCode 中的「二叉树中的好节点」
问题简述
在 LeetCode 的一道经典题「1448. 二叉树中的好节点」中,我们需要找出二叉树中符合一定条件的「好节点」:从根节点到该节点的路径上,不存在任何值大于该节点的节点。
递归算法的实现
解决这个问题,我们可以采用递归算法。具体实现步骤如下:
- 定义递归函数 dfs: 该函数接受两个参数:当前节点 node 和当前路径上的最大值 maxVal。
- 递归基: 如果 node 为空,则返回 0,表示没有「好节点」。
- 计算当前节点的状态: 如果 node 的值大于或等于 maxVal,则该节点是一个「好节点」,计数加 1;同时,更新 maxVal 为当前节点的值。
- 递归左右子树: 分别递归遍历 node 的左右子树,计算子树中的「好节点」数量,并累加到总计数中。
代码实现
Java 代码实现:
public class Solution {
public int goodNodes(TreeNode root) {
return dfs(root, Integer.MIN_VALUE);
}
private int dfs(TreeNode node, int maxVal) {
if (node == null) {
return 0;
}
int count = 0;
if (node.val >= maxVal) {
count = 1;
maxVal = node.val;
}
count += dfs(node.left, maxVal);
count += dfs(node.right, maxVal);
return count;
}
}
理解算法
该算法采用深度优先遍历,从根节点开始,逐层递归向下遍历二叉树。在每个节点,我们维护一个变量 maxVal,记录从根节点到当前节点的路径上的最大值。如果当前节点的值大于或等于 maxVal,则该节点是一个「好节点」,计数加 1,同时更新 maxVal 为当前节点的值。
结论
通过使用递归算法,我们可以高效地求出二叉树中的「好节点」数量。这种算法易于理解和实现,可以应用于解决其他类似的问题,如求解二叉树的最大深度、最小值和最大值等。
常见问题解答
1. 为什么需要维护 maxVal 变量?
maxVal 变量记录了从根节点到当前节点的路径上的最大值。这有助于我们判断当前节点是否是一个「好节点」,因为一个「好节点」的路径上不能出现比它更大的值。
2. 如何处理空节点?
在递归基中,如果 node 为空,则返回 0,表示没有「好节点」。这是因为空节点不会对路径上的最大值产生影响。
3. 为什么递归中 count += dfs(node.left, maxVal) 会重复计算?
不会重复计算。虽然两个递归调用使用相同的 maxVal,但它们遍历不同的子树,计算不同的「好节点」数量。
4. 递归算法的复杂度是多少?
递归算法的复杂度为 O(N),其中 N 是二叉树中的节点数量。这是因为算法需要遍历每个节点一次。
5. 是否有其他解决该问题的算法?
除递归外,还可以使用迭代法或深度优先搜索结合栈或队列来解决该问题。