深入剖析剑指 Offer II 051:节点和最大的路径
2023-10-06 12:52:02
在编程的世界里,二叉树作为一种数据结构,以其灵活高效而著称。而当我们讨论二叉树时,求解“节点之和最大的路径”的问题就显得尤为重要。
剑指 Offer II 051:节点之和最大的路径
本期剑指 Offer II 051 题意如下:
给你一棵以 root
为根的二叉树,返回 任意一条路径 的最大路径和。
路径被定义为沿着树中相邻结点的向下路径。路径中结点和的最大值即为路径和。
难度:困难
通过率:41.6%
考察要点:
- 树的深度优先遍历(DFS)
解题思路:
求解本题的关键在于巧妙地运用深度优先遍历(DFS)算法。DFS 是一种遍历二叉树的递归算法,通过沿着树的深度优先搜索,我们可以获得从根节点到每个叶节点的路径。
算法步骤:
-
初始化: 定义一个变量
max_sum
保存最大路径和,并初始化为负无穷大(-∞)。 -
递归函数: 定义一个名为
dfs
的递归函数,它接收一个节点root
作为参数,并返回该节点子树的路径和最大值。 -
终止条件: 当
root
为null
时,返回 0。 -
左子树和右子树: 分别递归调用
dfs
函数计算root
的左子树和右子树的路径和最大值,并保存为left_max
和right_max
。 -
路径和: 计算
root
节点到其左子树和右子树的最大路径和,并更新max_sum
。 -
返回: 返回
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 算法对于解决这类问题至关重要。
拓展阅读: