返回

深入剖析剑指 Offer II 051:节点和最大的路径

前端

在编程的世界里,二叉树作为一种数据结构,以其灵活高效而著称。而当我们讨论二叉树时,求解“节点之和最大的路径”的问题就显得尤为重要。

剑指 Offer II 051:节点之和最大的路径

本期剑指 Offer II 051 题意如下:

给你一棵以 root 为根的二叉树,返回 任意一条路径 的最大路径和。

路径被定义为沿着树中相邻结点的向下路径。路径中结点和的最大值即为路径和。

难度:困难

通过率:41.6%

考察要点:

  • 树的深度优先遍历(DFS)

解题思路:

求解本题的关键在于巧妙地运用深度优先遍历(DFS)算法。DFS 是一种遍历二叉树的递归算法,通过沿着树的深度优先搜索,我们可以获得从根节点到每个叶节点的路径。

算法步骤:

  1. 初始化: 定义一个变量 max_sum 保存最大路径和,并初始化为负无穷大(-∞)。

  2. 递归函数: 定义一个名为 dfs 的递归函数,它接收一个节点 root 作为参数,并返回该节点子树的路径和最大值。

  3. 终止条件:rootnull 时,返回 0。

  4. 左子树和右子树: 分别递归调用 dfs 函数计算 root 的左子树和右子树的路径和最大值,并保存为 left_maxright_max

  5. 路径和: 计算 root 节点到其左子树和右子树的最大路径和,并更新 max_sum

  6. 返回: 返回 root 节点的路径和最大值。

时间复杂度:

O(N),其中 N 为二叉树的节点数。由于 DFS 算法需要遍历二叉树中的每个节点一次,因此时间复杂度为 O(N)。

代码实现:

class Solution {
    int max_sum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        dfs(root);
        return max_sum;
    }

    private int dfs(TreeNode root) {
        if (root == null) {
            return 0;
        }

        int left_max = dfs(root.left);
        int right_max = dfs(root.right);

        max_sum = Math.max(max_sum, root.val + left_max + right_max);

        return Math.max(0, root.val + Math.max(left_max, right_max));
    }
}

示例:

考虑以下二叉树:

           1
          / \
         2   3
        / \
       4   5

使用上述算法,我们可以找到最大路径和为 6,即从节点 4 到节点 5 的路径和。

总结:

剑指 Offer II 051 题是一道考察树的深度优先遍历(DFS)算法的难题。通过巧妙地运用 DFS,我们可以求解出二叉树中节点和最大的路径。掌握 DFS 算法对于解决这类问题至关重要。

拓展阅读: