给定一个二叉树的头节点head,路径的规定有以下三种不同的规定:
    1)路径必须是头节点出发,到叶节点为止,返回最大路径和
    2)路径可以从任何节点出发,但必须往下走到达任何节点,返回最大路径和

    1. class TreeNode {
    2. int val;
    3. TreeNode left;
    4. TreeNode right;
    5. TreeNode(int x) {
    6. val = x;
    7. }
    8. }
    9. public int findmax(TreeNode root)
    10. {
    11. if (root==null)
    12. {
    13. return 0;
    14. }
    15. return f(root).allTreeMaxsum;
    16. }
    17. }
    18. public class Info{
    19. public int allTreeMaxsum;
    20. public int fromHeadMaxsum;
    21. public Info(int all,int from)
    22. {
    23. allTreeMaxsum= all;
    24. fromHeadMaxsum = from;
    25. }
    26. }
    27. public Info f(TreeNode x)
    28. {
    29. if (x==null)
    30. {
    31. return null;
    32. }
    33. Info leftInfo = f(x.left);
    34. Info rightInfo =f(x.right);
    35. int p1=Integer.MIN_VALUE;
    36. if (leftInfo!=null)
    37. {
    38. p1= leftInfo.allTreeMaxsum;
    39. }
    40. int p2=Integer.MIN_VALUE;
    41. if (rightInfo!=null)
    42. {
    43. p2 = rightInfo.allTreeMaxsum;
    44. }
    45. int p3 = x.val;
    46. int p4 = Integer.MIN_VALUE;
    47. if (leftInfo!=null)
    48. {
    49. p4 = x.val+leftInfo.fromHeadMaxsum;
    50. }
    51. int p5 = Integer.MIN_VALUE;
    52. if (rightInfo!=null)
    53. {
    54. p5 = x.val+rightInfo.fromHeadMaxsum;
    55. }
    56. int allTreeMaxsum = Math.max(Math.max(Math.max(p1,p2),p3),Math.max(p4,p5));
    57. int fromHeadMaxsum = Math.max(p3,Math.max(p4,p5));
    58. return new Info(allTreeMaxsum,fromHeadMaxsum);
    59. }