给定一个非空二叉树,返回其最大路径和。

    本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

    1. class Solution {
    2. //这题首先想到通过Math.max做比较实现,也就是提前顶一个一个最大值max,通过max与root.val+root.left.val+root.right.val进行比较
    3. //更大的设置为max
    4. int sum = Integer.MIN_VALUE;
    5. public int maxPathSum(TreeNode root) {
    6. dfs(root);
    7. return sum;
    8. }
    9. public int dfs(TreeNode root){
    10. if(root == null){
    11. return 0;
    12. }
    13. //通过递归计算左右子树
    14. int sumLeft = Math.max(dfs(root.left),0);
    15. int sumRight = Math.max(dfs(root.right),0);
    16. //节点值相加
    17. int sumRoot = root.val+sumLeft+sumRight;
    18. //将节点最大值与定义的max做比较
    19. sum = Math.max(sumRoot,sum);
    20. return root.val+Math.max(sumLeft,sumRight);
    21. }
    22. }

    你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。

    1. class Solution {
    2. public int[] pondSizes(int[][] land) {
    3. //这里不要用set,set虽然会有序,但是不能重复,
    4. //所以会将许多数据过滤,用List,最后通过sort方法进行排序
    5. List list = new ArrayList();
    6. if(land.length==0) return new int [0];
    7. for(int i = 0;i<land.length;i++){
    8. for(int j=0;j<land[0].length;j++){
    9. if(land[i][j]==0){
    10. list.add(dfs(land,i,j));
    11. }
    12. }
    13. }
    14. list.sort((o1,o2)-> o1-o2);
    15. return list.stream().mapToInt(Integer::intValue).toArray();
    16. }
    17. //深度优先算法,类似岛屿的问题,岛屿的问题不计算对角线,这里需要计算对角线
    18. public int dfs(int[][] land,int i,int j){
    19. //设定返回条件
    20. if(i<0 || j<0 || i >= land.length || j >= land[0].length || land[i][j] != 0){
    21. return 0;
    22. }
    23. //设置标志位,标记该点已被搜索
    24. land[i][j] = -1;
    25. //初始化池塘大小
    26. int value = 1;
    27. //计算池塘大小,从垂直、水平、对角线计算
    28. value += dfs(land,i-1,j-1);
    29. value += dfs(land,i-1,j+1);
    30. value += dfs(land,i-1,j);
    31. value += dfs(land,i,j-1);
    32. value += dfs(land,i,j+1);
    33. value += dfs(land,i+1,j-1);
    34. value += dfs(land,i+1,j+1);
    35. value += dfs(land,i+1,j);
    36. return value;
    37. }
    38. }

    根据一棵树的前序遍历与中序遍历构造二叉树。

    
    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            if(preorder == null && inorder == null) return null;
            return dfs(preorder,inorder,0,preorder.length,0,inorder.length);
        }
    
        public TreeNode dfs(int[] pre,int[] mid,int preLeft,int preRight,int midLeft,int midRight){
            if(preLeft == preRight){
                return null;
            }
    
            //设置根节点
            TreeNode res = new TreeNode(pre[preLeft]);
    
    
            int index = 0;
    
            for(int i=midLeft;i<midRight;i++){
                if(pre[preLeft] == mid[i]){
                    index = i;
                    break;
                }
            }
            res.left = dfs(pre,mid,preLeft+1,preLeft+index-midLeft+1,midLeft,index);
            res.right = dfs(pre,mid,preLeft+index-midLeft+1,preRight,index+1,midRight);
    
            return res;
    
    
        }
    }