力扣labuladong——一刷day48

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣1602. 找到二叉树中最近的右侧节点
  • 二、力扣437. 路径总和 III
  • 三、力扣560. 和为 K 的子数组


前言


二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「遍历」的思维模式

一、力扣1602. 找到二叉树中最近的右侧节点

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int dif = Integer.MAX_VALUE;
    TreeNode res = null;
    int high = -1;
    int flag = -1;
    public TreeNode findNearestRightNode(TreeNode root, TreeNode u) {
        fun(root, u, 1,1);
        return res;
    }
    public void fun(TreeNode root, TreeNode u, int index, int depth){
        if(root == null){
            return;
        }
        if(root == u){
            high = depth;
            flag = index;
        }else if(high == depth){
            if((index - flag) < dif){
                res = root;
                dif = index - flag;
            }
        }
        fun(root.left , u, index * 2, depth + 1);
        fun(root.right, u, index *2 + 1, depth + 1);
    }
}

二、力扣437. 路径总和 III

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Long,Integer> preSumPath = new HashMap<>();
    int res = 0;
    long targetSum , pathSum ;
    public int pathSum(TreeNode root, int targetSum) {
        if(root == null){
            return 0;
        }
        this.targetSum = targetSum;
        this.pathSum = 0;
        preSumPath.put(0L,1);
        fun(root);
        return res;
    }
    public void fun(TreeNode root){
        if(root == null){
            return;
        }
        pathSum += root.val;
        res += preSumPath.getOrDefault(pathSum - targetSum,0);
        preSumPath.put(pathSum, preSumPath.getOrDefault(pathSum,0)+1);
        fun(root.left);
        fun(root.right);
        preSumPath.put(pathSum,preSumPath.getOrDefault(pathSum,0)-1);
        pathSum -= root.val;
    }
}

三、力扣560. 和为 K 的子数组

class Solution {
    public int subarraySum(int[] nums, int k) {
        int[] preSum = new int[nums.length+1];
        for(int i = 0; i < nums.length; i ++){
            preSum[i+1] = nums[i] + preSum[i];
        }
        int count = 0;
        for(int low = 0; low < preSum.length - 1; low ++){
            for(int high = low; high < preSum.length-1; high ++){
                if(preSum[high + 1] - preSum[low] == k){
                    count ++;
                }
            }
        }
        return count;
    }
}

你可能感兴趣的:(力扣题解,leetcode,算法,java,职场和发展,数据结构)