1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
class
Solution { public : int
maxPathSum(TreeNode *root) { int
s, m; dfs(root, s, m); return
(m > s) ? m : s; } void
dfs(TreeNode* root, int & sole, int & misc) { if
(root == NULL) { sole = INT_MIN; misc = INT_MIN; return ; } int
ls, lm, rs, rm, ms, mm; dfs(root->left, ls, lm); dfs(root->right, rs, rm); ms = (ls > rs) ? ls : rs; mm = (lm > rm) ? lm : rm; sole = root->val + (ms < 0 ? 0 : ms); int
m = ((ls < 0 ? 0 : ls) + (rs < 0 ? 0 : rs) + root->val); misc = mm > m ? mm : m; } }; |
dfs深度优先遍历计算路径和,它分别计算经过该节点,且另一个端点在左或右子树中的最大路径和(得到的这两个路径是不会跨越该节点的,用sole表示),那么对于那些端点不包括当前节点,分布在左/右子树中的(该种类的)最大路径和用misc表示。则以当前节点为根的子树的最大路径和,可能是其某个子树中的misc类路径,也可能是左sole+右sole+当前节形成的路径,通过比较他们两者的值我们可以得到该子树的最大路径和。同样的对于整棵树也是如此。
可以看到misc变量只负责存储dfs搜索过程中的最大路径和,因此也可以把包含左右子树中路径的最大路径和存到一个全局/类变量中,并初始化为最小值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
class
Solution { private : int
max_path; public : int
maxPathSum(TreeNode *root) { max_path = INT_MIN; dfs(root); return
max_path; } int
dfs(TreeNode* root) { if
(root == NULL) return
0; int
ls = dfs(root->left); int
rs = dfs(root->right); int
ms = (ls > rs) ? ls : rs; int
sole = root->val + (ms < 0 ? 0 : ms); int
m = ((ls < 0 ? 0 : ls) + (rs < 0 ? 0 : rs) + root->val); if
(m > max_path) max_path = m; return
sole; } }; |
参考:
zhuli题解 http://www.cnblogs.com/zhuli19901106/p/3547387.html
LeetCode Binary Tree Maximum Path Sum,布布扣,bubuko.com
LeetCode Binary Tree Maximum Path Sum
原文:http://www.cnblogs.com/lailailai/p/3617048.html