二叉树的最大路径和_二叉树

 

 思路: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;//可能有负数,不能初始化为0public 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;//返回 根加左子树 或 根加右子树 其中最长的一条路径    }
}