给定一个非空二叉树
,返回其最大路径和。node
路径 : 一条从树中任意节点
出发,达到任意节点
的序列。该路径至少包含一个节点
,且不必定通过根节点。bash
输入: [1,2,3] 1 / \ 2 3 输出: 6
输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 输出: 42
经过 &max 来记录全局最大值,经过返回ret来记录递归返回的值
code
二叉树 abc,a 是根结点(递归中的 root),bc 是左右子结点(表明其递归后的最优解)。
最大的路径,可能的只有三种路径状况:blog
a / \ b c
其中状况 1,表示若是不联络父结点的状况,或自己是根结点的状况。
这种状况是无法递归的,可是结果有多是全局最大路径和。
状况 2 和 3,递归时计算 a+b 和 a+c,选择一个更优的方案返回,也就是上面说的递归后的最优解啦。
另外结点有多是负值,最大和确定就要想办法舍弃负值(max(0, x))(max(0,x))。递归
可是上面 3 种状况,不管哪一种,a 做为联络点,都不可以舍弃。three
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ int result = -2147483648; int helper(struct TreeNode* root) { if (root == NULL) return 0; int left = helper(root->left); int right = helper(root->right); int threeNodeSum = root->val + left + right; int twoNodeSum = root->val + max(left, right); int oneNodeSum = root->val; int ret = max(twoNodeSum, oneNodeSum); int currentMax = max(ret, threeNodeSum); result = max(currentMax, result); return ret; } int max(int a, int b) { return a > b ? a : b; } int maxPathSum(struct TreeNode* root){ result = -2147483648; int temp = helper(root); return result; }
#define max(a, b) ((a) > (b) ? (a) : (b)) int maxPath = INT_MIN; int dfs(struct TreeNode *root) { if (root == NULL) { return 0; } // 左子树的最大和 int left = dfs(root->left); // 右子树的最大和 int right = dfs(root->right); // 当前节点路径(不须要联系父结点,或自己就已是根结点而无父节点)的最大值 VS 当前全局最大值 maxPath = max(left + right + root->val, maxPath); // 须要联系父节点,所以只返回子树最大分支 return max(0, max(left, right) + root->val); } int maxPathSum(struct TreeNode *root) { // 初始化为最小可能的整数 maxPath = INT_MIN; // 深度优先遍历 dfs(root); return maxPath; }