这是二叉树的一个品类,搞得不多。
二叉搜索树呢,也多是 中序遍历,这和 二叉树无关,关乎我们对二叉树的进一步认识。

1.有序数组 生成 二叉搜索树

2.有序数组 生成 高度平衡的二叉搜索树

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

109. 有序链表转换二叉搜索树
类似

3.平衡 二叉树 相关

1382. 将二叉搜索树变平衡

借助 108 的解题思路

  1. var balanceBST = function(root) {
  2. let nums = [];
  3. function dfs(node) {
  4. if (!node) {
  5. return;
  6. }
  7. dfs(node.left);
  8. nums.push(node.val);
  9. dfs(node.right);
  10. }
  11. dfs(root); // 生成有序数组
  12. let n = nums.length;
  13. function createTree(left, right) {
  14. if (left > right) {
  15. return null;
  16. }
  17. let mid = left + Math.floor((right - left) / 2);
  18. let newNode = new TreeNode(nums[mid]);
  19. newNode.left = createTree(left, mid - 1);
  20. newNode.right = createTree(mid + 1, right);
  21. return newNode;
  22. }
  23. return createTree(0, n - 1); // 根据有序数组递归生成平衡树
  24. };

96. 不同的二叉搜索树

根据有序数组生成 二叉搜索树是不唯一的,本题就是数数,但是用到的是动态规划的思路。

  1. var numTrees = function(n) {
  2. let dp = new Array(n + 1).fill(0);
  3. dp[0] = 1;
  4. dp[1] = 1;
  5. for (let i = 2; i <= n; i++) {
  6. for (let j = 0; j < i; j++) {
  7. dp[i] += dp[j] * dp[i - 1 - j]; // 就是硬找规律
  8. }
  9. }
  10. return dp[n];
  11. };

285. 二叉搜索树中的中序后继

  1. var inorderSuccessor = function(root, p) {
  2. let target = null;
  3. let hasfound = false;
  4. function dfs(node) {
  5. if (!node) {
  6. return null;
  7. }
  8. // 一开始我把中序遍历的操作 当做条件阻挡放在前序的位置,这样的操作其实很错乱
  9. // if (hasfound) {
  10. // if (target === null) { // 第一次赋值
  11. // target = node;
  12. // }
  13. // return;
  14. // }
  15. dfs(node.left);
  16. // 这是递归返回要一直执行的地方啊
  17. if (p.val === node.val) {
  18. hasfound = true;
  19. } else if (hasfound) {
  20. if (target === null) { // 第一次赋值
  21. target = node;
  22. }
  23. return;
  24. }
  25. dfs(node.right);
  26. }
  27. dfs(root);
  28. return target;
  29. };

510. Inorder Successor in BST II

  1. var inorderSuccessor = function(node) { // 只能向上走,缺乏向下走的路
  2. if (node === null) {
  3. return null;
  4. }
  5. // 先找 root 可转化题目为 285 leetcode
  6. let root = node;
  7. while (root.parent) { // 找 root
  8. root = root.parent;
  9. }
  10. let hasfound = false;
  11. let target = null;
  12. function dfs(n) {
  13. if (!n) {
  14. return null;
  15. }
  16. dfs(n.left);
  17. if (n.val === node.val) {
  18. hasfound = true;
  19. } else if (hasfound) {
  20. if (target === null) {
  21. target = n; // 大意的错误
  22. }
  23. return;
  24. }
  25. dfs(n.right);
  26. }
  27. dfs(root);
  28. return target;
  29. };