1、把二叉树转换成累加树
//给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于
// node.val 的值之和。
//
// 提醒一下,二叉搜索树满足下列约束条件:
//
//
// 节点的左子树仅包含键 小于 节点键的节点。
// 节点的右子树仅包含键 大于 节点键的节点。
// 左右子树也必须是二叉搜索树。
//
//
// 注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-s
//um-tree/ 相同
//
//
//
// 示例 1:
//
//
//
// 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
//输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
//
//
// 示例 2:
//
// 输入:root = [0,null,1]
//输出:[1,null,1]
//
//
// 示例 3:
//
// 输入:root = [1,0,2]
//输出:[3,3,2]
//
//
// 示例 4:
//
// 输入:root = [3,2,4,1]
//输出:[7,9,4,10]
//
//
//
//
// 提示:
//
//
// 树中的节点数介于 0 和 104 之间。
// 每个节点的值介于 -104 和 104 之间。
// 树中的所有值 互不相同 。
// 给定的树为二叉搜索树。
//
// Related Topics 树 深度优先搜索 二叉搜索树 二叉树
采用反中序遍历的方式,因为右子树的数会影响到左子树的值,所以应该先遍历右边进行累加:
class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {TreeNode node = root;//反序中序遍历if(root != null){convertBST(root.right);sum += root.val;root.val = sum;convertBST(root.left);}return root;}
}
这样累加和最大的那个必定是二叉树的最左叶子节点
2、和为K的子数组
//给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
//
// 示例 1 :
//
//
//输入:nums = [1,1,1], k = 2
//输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
//
//
// 说明 :
//
//
// 数组的长度为 [1, 20,000]。
// 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
//
// Related Topics 数组 哈希表 前缀和
这个题目需要注意,他是有负数的,所以不是很好搞,只能判断其前缀中是否有想用的数存在了,比如累加到num[i],累加和是7,最后需要和成2,最后就需要判断前边的数中是否有前缀和等于5的时候,前缀和为5出现几次就计数几次。
public int subarraySum(int[] nums, int k) {int count = 0;int pre = 0;HashMap<Integer, Integer> map = new HashMap<>();//以和为键,出现次数为值map.put(0, 1);for (int i = 0; i < nums.length; i++) {pre += nums[i];if(map.containsKey(pre-k)){count += map.get(pre-k);}map.put(pre,map.getOrDefault(pre,0)+1);}return count;}