Leetcode 669.修剪二叉搜索树

题目:669.修剪二叉搜索树 讲解:https://www.bilibili.com/video/BV17P41177ud

初始思路

像450.删除二叉搜索树中的节点

代码

  1. var trimBST = function (root, low, high) {
  2. if (!root) return null
  3. //如果该节点值小于最小值,则该节点更换为该节点的右节点值,继续遍历
  4. if (root.val < low) {
  5. return trimBST(root.right, low, high)
  6. }
  7. //如果该节点的值大于最大值,则该节点更换为该节点的左节点值,继续遍历
  8. if (root.val > high) {
  9. return trimBST(root.left, low, high)
  10. }
  11. root.left = trimBST(root.left, low, high)
  12. root.right = trimBST(root.right, low, high)
  13. return root
  14. };
  1. var trimBST = function (root, low, high) {
  2. if (root == null) {
  3. return null;
  4. }
  5. // 处理头结点,让root移动到[low, high] 范围内,注意是左闭右闭
  6. while (root !== null && (root.val < low || root.val > high)) {
  7. if (root.val < low) {
  8. root = root.right;
  9. } else {
  10. root = root.left;
  11. }
  12. }
  13. let cur = root;
  14. // 此时root已经在[low, high] 范围内,处理左孩子元素小于low的情况
  15. while (cur !== null) {
  16. while (cur.left && cur.left.val < low) {
  17. cur.left = cur.left.right;
  18. }
  19. cur = cur.left;
  20. }
  21. cur = root;
  22. //判断右子树大于high的情况
  23. while (cur !== null) {
  24. while (cur.right && cur.right.val > high) {
  25. cur.right = cur.right.left;
  26. }
  27. cur = cur.right;
  28. }
  29. return root;
  30. };

感想

  1. 递归更好理解,学会递归写法。

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

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

初始思路

找到数组的中点,左半部分作为左子树,右半部分作为右子树,递归构建BST。

代码

  1. var sortedArrayToBST = function (nums) {
  2. if (nums.length === 0) return null
  3. const mid = Math.floor(nums.length / 2)
  4. const root = new TreeNode(nums[mid])
  5. root.left = sortedArrayToBST(nums.slice(0, mid))
  6. root.right = sortedArrayToBST(nums.slice(mid + 1))
  7. return root
  8. };

感想

  1. JS除法会带小数。。。记得取整一下

Leetcode 538.把二叉搜索树转换为累加树

题目:538.把二叉搜索树转换为累加树

初始思路

看了第一遍题目都没看懂。。。如果平摊成数组的话就是从后开始累加。

代码

  1. var convertBST = function (root) {
  2. let pre = 0
  3. const reverseInOrder = (cur) => {
  4. if (cur) {
  5. // 右
  6. reverseInOrder(cur.right)
  7. // 中
  8. cur.val += pre
  9. pre = cur.val
  10. // 左
  11. reverseInOrder(cur.left)
  12. }
  13. }
  14. reverseInOrder(root)
  15. return root
  16. };
  1. var convertBST = function (root) {
  2. let pre = 0;
  3. let cur = root;
  4. let stack = [];
  5. while (cur !== null || stack.length !== 0) {
  6. while (cur !== null) {
  7. stack.push(cur);
  8. cur = cur.right;
  9. }
  10. cur = stack.pop();
  11. cur.val += pre;
  12. pre = cur.val;
  13. cur = cur.left;
  14. }
  15. return root;
  16. };

感想

  1. 由图可以看出来,最右边的节点的值是最小的,往上开始加,最左侧的节点的值是最大的。所以递归方向是:右中左。
    image.png
  2. 迭代用的是中序遍历模板,把处理逻辑放在遍历中。
  3. 写了十天二叉树,我的天哪。
  4. 二叉树总结篇:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html#%E6%9C%80%E5%90%8E%E6%80%BB%E7%BB%93