思路: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;//返回 根加左子树 或 根加右子树 其中最长的一条路径 } }