← 返回目录

将有序数组转换为二叉搜索树

第 7 / 42 卷日期:

这个题和之前写的 t106.从中序与后序遍历序列构造二叉树基本一致。

不一样的地方是,本题的切分点是数组nums的中间位置。然后按照以下步骤:

  1. 终止条件:数组为空,return null
  2. 切分点:index = left +(right-left)/ 2
  3. 新建根节点:TreeNode root = new TreeNode(nums[index]);

如果数组nums只剩下一个元素,则return root

  1. 分割数组:[0, index) [index + 1, len)
  2. 递归左右遍历

注意【不变量】,后来[左闭右开) 和[左闭右闭]都过了,还是觉得这个题[左闭右闭]友好一些

把二叉搜索树转换为累加树

直接【右/根/左】反中序遍历一遍二叉树进行了。

  1. 由于遍历整颗树,而且不用增/删BST,所以递归不需要返回类型。
  2. 用一个sum 记录当前节点之前的节点和 sum
  3. 右 -> 递归遍历右子树
  4. 根 -> 逻辑处理
  5. 左 -> 递归遍历左子树

这个题也可用迭代法,要用栈。仍然是反中序【右/根/左】

回溯

1. 组合问题

  1. 对于同一集合问题:需要使用startIndex记录横向遍历的起始位置
  2. 给定数组中的元素是否可以重复多次选择问题:若可重复选择,下一层递归的起始位置为 i;若不可重复选

择,下一层递归的起始位置 i

2. 组合总和(组合问题 +求和)

剪枝操作(关键):

if(sum > target) return;

// 1. 当前累加和已经大于目标和 sum + candidates[i] <= tartget;

// 2. 先判断当前和是否大于目标和,是则不累加下一层的节点

全站分卷索引 · 42 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
  2. 2找出所有子集的异或总和再求和
  3. 3哈希表
  4. 4哈希冲突
  5. 5红黑树与AVL树
  6. 6平衡二叉树(AVL树)
  7. 7将有序数组转换为二叉搜索树
  8. 83. 分割(组合问题)
  9. 9方法论
  10. 10509. 斐波那契数
  11. 1162. 不同路径
  12. 1296. 不同的二叉搜索树
  13. 13322. 零钱兑换
  14. 14爬楼梯
  15. 15背包小总结 (01背包、完全背包)
  16. 16子序列问题
  17. 17674. 最长连续递增序列
  18. 18115. 不同的子序列
  19. 19总结
  20. 20技巧总结
  21. 21时间序列模型
  22. 22区间DP模型
  23. 23664. 奇怪的打印机
  24. 24编辑距离
  25. 25回文串
  26. 26DP递推公式总结
  27. 27排序算法
  28. 28其他算法
  29. 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
  30. 302. TOP N问题
  31. 313. 分布式的TOP N问题
  32. 322. Astar数据结构 + 公式
  33. 334. 代码实现
  34. 345. 总体代码
  35. 35堆排序
  36. 36单源最短路
  37. 37思维导图
  38. 38链表
  39. 39回溯
  40. 40贪心
  41. 41动态规划
  42. 42排序