牛客NC6 二叉树的最大路径和(二叉树的遍历,递归,动态规划)

原题链接

/**
 * @author 49367
 * @date 2021/4/28 10:54
 */
public class MaxPathSumNC6 {

    private int maxSum = Integer.MIN_VALUE;
    /**
     * 获取树的最大路径,开始结点和结束结点都可以是任意结点
     * @param root TreeNode类
     * @return int整型
     */
    public int maxPathSum (TreeNode root) {
        // write code here
        getMaxPathSum(root);
        return maxSum;
    }

    /**
     * 递归获取树中的最大路径
     *      后序遍历的思想,从下往上找路径
     * @param root
     * @return
     */
    private int getMaxPathSum(TreeNode root) {
        if (root == null)
            return 0;

        int leftMaxSum = getMaxPathSum(root.left);
        int rightMaxSum = getMaxPathSum(root.right);
        int maxSubPath = Math.max(0, Math.max(leftMaxSum, rightMaxSum));
        /*
            路径可以是从左结点到根结点,也可是从右结点到根节点,也可是从左结点经根结点到右结点
            也可以只是根结点本身
         */
        maxSum = Math.max(Math.max(maxSum, root.val + maxSubPath),
                root.val + leftMaxSum + rightMaxSum);

        // 往上走,只能是从左结点到根结点再往上或者是从右结点到根结点再往上,或者从根节点直接往上
        return Math.max(root.val, root.val + maxSubPath);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值