目录
牛客_NC6二叉树中的最大路径和_树形DP
题目解析
C++代码
Java代码
牛客_NC6二叉树中的最大路径和_树形DP
二叉树中的最大路径和_牛客题霸_牛客网 (nowcoder.com)
描述:
二叉树里面的路径被定义为:从该树的任意节点出发,经过父=>子或者子=>父的连接,达到任意节点的序列。
注意:
1.同一个节点在一条二叉树路径里中最多出现一次
2.一条路径至少包含一个节点,且不一定经过根节点
给定一个二叉树的根节点root,请你计算它的最大路径和
例如:
给出以下的二叉树,
最优路径是:2=>1=>3,或者3=>1=>2,最大路径和=2+1+3=6
数据范围:节点数满足 1≤n≤10^5 ,节点上的值满足 ∣val∣≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
题目解析
- 树形dp:
- a. 左子树收集:以左子树为起点的最大单链和;
- b. 右子树收集:以右子树为起点的最大单链和;
- c. 根节点要做的事情:整合左右子树的信息,得到经过根节点的最大路径和;
- d. 向上返回:以根节点为起点的最大单链和。
C++代码
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <climits>
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @return int整型*/int pathSum = INT_MIN;int maxPathSum(TreeNode* root) {dfs(root);return pathSum;}int dfs(TreeNode* root) // 获取以此结点为根结点的最大单链和{if(root == nullptr)return 0;int left = max(0, dfs(root->left)); // 获取左子树的最大单链和int right = max(0, dfs(root->right)); // 获取右子树的最大单链和pathSum = max(pathSum, root->val + left + right); // 更新经过次结点最大路径和return root->val + max(left, right); // 返回最大单链和}
};
Java代码
import java.util.*;
/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* public TreeNode(int val) {* this.val = val;* }* }*/
public class Solution
{int ret = -1010;public int maxPathSum (TreeNode root) {dfs(root);return ret;}int dfs(TreeNode root){if(root == null)return 0;int l = Math.max(0, dfs(root.left)); // 左⼦树为根的最⼤单链和int r = Math.max(0, dfs(root.right)); // 右⼦树为根的最⼤单链和// 经过root的最⼤路径和ret = Math.max(ret, root.val + l + r);return root.val + Math.max(l, r);}
}