题目链接:669. 修剪二叉搜索树
给你二叉搜索树的根节点 root
,同时给定最小边界low
和最大边界 high
。通过修剪二叉搜索树,使得所有节点的值在[low, high]
中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
示例 1:
输入:root = [1,0,2], low = 1, high = 2 输出:[1,null,2]
示例 2:
输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3 输出:[3,2,null,1]
提示:
[1, 104]
内0 <= Node.val <= 104
0 <= low <= high <= 104
文章讲解:代码随想录
视频讲解:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
思路:如果当前节点为要删除的节点,则返回剪枝后的左子树或右子树。否则,递归的裁剪左子树和右子树。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} low
* @param {number} high
* @return {TreeNode}
*/
var trimBST = function(root, low, high) {
if (!root) {
return null;
}
if (root.val < low) {
return trimBST(root.right, low, high); // 剪掉 root 及左子树
}
if (root.val > high) {
return trimBST(root.left, low, high); // 剪掉 root 及右子树
}
root.left = trimBST(root.left, low, high); // 递归的修剪左子树
root.right = trimBST(root.right, low, high); // 递归的修剪右子树
return root;
};
分析:时间复杂度为 O(n),空间复杂度为 O(logn)。
思路:先处理头节点,将 root 移动到 [low, high] 范围内,然后剪枝左子树和右子树。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} low
* @param {number} high
* @return {TreeNode}
*/
var trimBST = function(root, low, high) {
// 将 root 移动到 [low, high] 范围内
while (root) {
if (root.val < low) {
root = root.right;
} else if (root.val > high) {
root = root.left;
} else {
break;
}
}
// 剪枝左子树
let cur = root;
while (cur) {
while (cur.left && cur.left.val < low) {
cur.left = cur.left.right;
}
cur = cur.left;
}
// 剪枝右子树
cur = root;
while (cur) {
while (cur.right && cur.right.val > high) {
cur.right = cur.right.left;
}
cur = cur.right;
}
return root;
};
分析:时间复杂度为 O(n),空间复杂度为 O(1)。
学习了使用二叉搜索树的特性来修剪二叉搜索树。