将有序数组转换为二叉搜索树
这个题和之前写的 t106.从中序与后序遍历序列构造二叉树基本一致。
不一样的地方是,本题的切分点是数组nums的中间位置。然后按照以下步骤:
- 终止条件:数组为空,return null
- 切分点:index = left +(right-left)/ 2
- 新建根节点:TreeNode root = new TreeNode(nums[index]);
如果数组nums只剩下一个元素,则return root
- 分割数组:[0, index) [index + 1, len)
- 递归左右遍历
注意【不变量】,后来[左闭右开) 和[左闭右闭]都过了,还是觉得这个题[左闭右闭]友好一些
把二叉搜索树转换为累加树
直接【右/根/左】反中序遍历一遍二叉树进行了。
- 由于遍历整颗树,而且不用增/删BST,所以递归不需要返回类型。
- 用一个sum 记录当前节点之前的节点和 sum
- 右 -> 递归遍历右子树
- 根 -> 逻辑处理
- 左 -> 递归遍历左子树
这个题也可用迭代法,要用栈。仍然是反中序【右/根/左】
回溯
1. 组合问题
- 对于同一集合问题:需要使用startIndex记录横向遍历的起始位置
- 给定数组中的元素是否可以重复多次选择问题:若可重复选择,下一层递归的起始位置为 i;若不可重复选
择,下一层递归的起始位置 i
2. 组合总和(组合问题 +求和)
剪枝操作(关键):
if(sum > target) return;
// 1. 当前累加和已经大于目标和 sum + candidates[i] <= tartget;
// 2. 先判断当前和是否大于目标和,是则不累加下一层的节点
全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序