知识点
LeetCode算法题
LeetCode算法题
124.【二叉树中的最大路径和】
解题思路:
二叉树问题必定使用递归,递归的核心就是将原问题拆分成子问题。
首先,对于过某个节点(非root节点)的最大路径有3种情况备选:过左节点最大路径+自己+父节点、过右节点最大路径+自己+父节点、过左节点最大路径+自己+过右节点最大路径。当前节点的最大路径和从这三种情况选择一个即可。
过左节点最大路径+自己、过右节点最大路径+自己可以通过递归计算,递归函数如下:
public int dfs(TreeNode root) { if (root == null) { return 0; } //计算左边分支最大值,左边分支如果为负数还不如不选择 int leftMax = Math.max(0, dfs(root.left)); //计算右边分支最大值,右边分支如果为负数还不如不选择 int rightMax = Math.max(0, dfs(root.right)); // 返回经过root的单边最大分支给当前root的父节点计算使用 return root.val + Math.max(leftMax, rightMax); }
因为递归函数体中,左右节点最大路径已经计算出来,因此可以定义一个全局变量max,存储最大的路径和,遍历全部节点计算并更新max,最终返回max。最终算法如下:
int max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { if (root == null) { return 0; } dfs(root); return max; } /** * 返回经过root的单边分支最大和, 即Math.max(root, root+left, root+right) * @param root * @return */ public int dfs(TreeNode root) { if (root == null) { return 0; } //计算左边分支最大值,左边分支如果为负数还不如不选择 int leftMax = Math.max(0, dfs(root.left)); //计算右边分支最大值,右边分支如果为负数还不如不选择 int rightMax = Math.max(0, dfs(root.right)); //left->root->right 作为路径与已经计算过历史最大值做比较 max = Math.max(max, root.val + leftMax + rightMax); // 返回经过root的单边最大分支给当前root的父节点计算使用 return root.val + Math.max(leftMax, rightMax); }