返回

二叉树中的「好节点」巧解:递归算法帮你轻松过关

java

掌握递归算法:巧解 LeetCode 中的「二叉树中的好节点」

问题简述

在 LeetCode 的一道经典题「1448. 二叉树中的好节点」中,我们需要找出二叉树中符合一定条件的「好节点」:从根节点到该节点的路径上,不存在任何值大于该节点的节点。

递归算法的实现

解决这个问题,我们可以采用递归算法。具体实现步骤如下:

  1. 定义递归函数 dfs: 该函数接受两个参数:当前节点 node 和当前路径上的最大值 maxVal。
  2. 递归基: 如果 node 为空,则返回 0,表示没有「好节点」。
  3. 计算当前节点的状态: 如果 node 的值大于或等于 maxVal,则该节点是一个「好节点」,计数加 1;同时,更新 maxVal 为当前节点的值。
  4. 递归左右子树: 分别递归遍历 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. 是否有其他解决该问题的算法?

除递归外,还可以使用迭代法或深度优先搜索结合栈或队列来解决该问题。