124. 二叉树中的最大路径和

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 124. 二叉树中的最大路径和

本题来自 LeetCode:124. 二叉树中的最大路径和[1]

题目描述

给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:


输入: [1,2,3]

       1
      / 
     2   3
输出: 6

示例  2:


输入: [-10,9,20,null,null,15,7]
    10
   / 
  9  20
    /  
   15   7
输出: 42

题目分析

最大值路径可能出现在以下四种场景(其中父节点可以二叉树中任意一个节点):

  • 父节点
  • 父节点 + max(左子节点路径和)
  • 父节点 + max(右子节点的路径和)
  • 父节点 + max(左子节点的路径和) + max(右子节点的路径和)
  • 那么可以通过深度遍历返回 max(父节点,父节点 + max(子节点到子节点的路径和))的值,将以上情况涵盖到。其中 子节点到子节点的路径和不能同时包含一个父节点的左右子节点。

    题目解答

    
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        // 记录最大路径和
        private int max = Integer.MIN_VALUE;
        public int maxPathSum(TreeNode root) {
            dfs(root);
            return max;
        }
        // 返回从root节点出发到其任意子节点路径的最大和
        public int dfs(TreeNode root) {
            // 记录 最大子路径和
            // 对应情况1
            int currentMax = root.val;
            if(root.left != null) {
                int leftMax = dfs(root.left);
                if(leftMax  0) {
                    // 对应情况2
                    currentMax = Math.max(leftMax + root.val, currentMax);
                }
            }
            if(root.right != null) {
                int rightMax = dfs(root.right);
                if(rightMax  0) {
                    // 对应情况4
                    max = Math.max(rightMax + currentMax, max);
                    // 对应情况3
                    currentMax = Math.max(rightMax + root.val, currentMax);
                }
            }
            // 对应情况1,2,3,4的最大值
            max = Math.max(currentMax, max);
            return currentMax;
        }
    }
    

    复杂度分析:
    时间复杂度: O(n)
    空间复杂度: O(n)

    参考资料

    1. 二叉树中的最大路径和: https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

    原文始发于微信公众号(xiaogan的技术博客):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 124. 二叉树中的最大路径和


     上一篇
    108&109. 将有序数组(链表)转换为二叉搜索树 108&109. 将有序数组(链表)转换为二叉搜索树
    二叉搜索树(Binary Search Tree)具有以下性质:它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左
    2021-04-05
    下一篇 
    988. 从叶结点开始的最小字符串 988. 从叶结点开始的最小字符串
    本题来自 LeetCode:988. 从叶结点开始的最小字符串[1] 题目描述给定一颗根结点为  root  的二叉树,书中的每个结点都有一个从  0 到  25  的值,分别代表字母  ‘a’ 到  ‘z’:值  0 代表  ‘a’,值
    2021-04-05