二叉树的最大路径和

 

 思路:dfs

  这道题由于开始和结束可以为任意节点,因此这里树是被当作无向图来搜索路径的,而不是以前的有向图。

  因此 dfs 的返回值要定义为以自己为根,从根节点到子节点的一条最长路径。

  具体实现是寻找左子树与右子树中的一条最长路径,比较取最长。

  而总的最长路径则为左子树最长路径 加右子树最长路径 加 根节点。

  在遍历时要注意输入节点值可能为负数,因此初始化的最长路径 res不能设为 0。

  寻找左子树与右子树中最长路径时,要保证其非负,否则对总最长路径无贡献。

代码:

  时间复杂度O(n),空间复杂度O(logn)

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int res = Integer.MIN_VALUE;//可能有负数,不能初始化为0
    public int maxPathSum (TreeNode root) {
        // write code here
        getMax(root);
        return res;
    }
    int getMax(TreeNode root) {
        if (root == null)
            return 0;
        int left = Math.max(0, getMax(root.left));//左子树最大值,非负
        int right = Math.max(0, getMax(root.right));
        res = Math.max(res, root.val + left + right);
        return Math.max(left, right) + root.val;//返回 根加左子树 或 根加右子树 其中最长的一条路径
    }
}

 

posted @ 2021-03-10 00:42  zjcfrancis  阅读(255)  评论(0编辑  收藏  举报