Leetcode 669.修剪二叉搜索树
题目:669.修剪二叉搜索树 讲解:https://www.bilibili.com/video/BV17P41177ud
初始思路
代码
var trimBST = function (root, low, high) {
if (!root) return null
//如果该节点值小于最小值,则该节点更换为该节点的右节点值,继续遍历
if (root.val < low) {
return trimBST(root.right, low, high)
}
//如果该节点的值大于最大值,则该节点更换为该节点的左节点值,继续遍历
if (root.val > high) {
return trimBST(root.left, low, high)
}
root.left = trimBST(root.left, low, high)
root.right = trimBST(root.right, low, high)
return root
};
var trimBST = function (root, low, high) {
if (root == null) {
return null;
}
// 处理头结点,让root移动到[low, high] 范围内,注意是左闭右闭
while (root !== null && (root.val < low || root.val > high)) {
if (root.val < low) {
root = root.right;
} else {
root = root.left;
}
}
let cur = root;
// 此时root已经在[low, high] 范围内,处理左孩子元素小于low的情况
while (cur !== null) {
while (cur.left && cur.left.val < low) {
cur.left = cur.left.right;
}
cur = cur.left;
}
cur = root;
//判断右子树大于high的情况
while (cur !== null) {
while (cur.right && cur.right.val > high) {
cur.right = cur.right.left;
}
cur = cur.right;
}
return root;
};
感想
- 递归更好理解,学会递归写法。
Leetcode 108.将有序数组转换为二叉搜索树
初始思路
找到数组的中点,左半部分作为左子树,右半部分作为右子树,递归构建BST。
代码
var sortedArrayToBST = function (nums) {
if (nums.length === 0) return null
const mid = Math.floor(nums.length / 2)
const root = new TreeNode(nums[mid])
root.left = sortedArrayToBST(nums.slice(0, mid))
root.right = sortedArrayToBST(nums.slice(mid + 1))
return root
};
感想
- JS除法会带小数。。。记得取整一下
Leetcode 538.把二叉搜索树转换为累加树
初始思路
看了第一遍题目都没看懂。。。如果平摊成数组的话就是从后开始累加。
代码
var convertBST = function (root) {
let pre = 0
const reverseInOrder = (cur) => {
if (cur) {
// 右
reverseInOrder(cur.right)
// 中
cur.val += pre
pre = cur.val
// 左
reverseInOrder(cur.left)
}
}
reverseInOrder(root)
return root
};
var convertBST = function (root) {
let pre = 0;
let cur = root;
let stack = [];
while (cur !== null || stack.length !== 0) {
while (cur !== null) {
stack.push(cur);
cur = cur.right;
}
cur = stack.pop();
cur.val += pre;
pre = cur.val;
cur = cur.left;
}
return root;
};
感想
- 由图可以看出来,最右边的节点的值是最小的,往上开始加,最左侧的节点的值是最大的。所以递归方向是:右中左。
- 迭代用的是中序遍历模板,把处理逻辑放在遍历中。
- 写了十天二叉树,我的天哪。
- 二叉树总结篇: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