这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。
题目链接/文章讲解: 669. 修剪二叉搜索树
视频讲解:669. 修剪二叉搜索树
直接想法就是:递归处理,然后遇到 root.val < low || root.val > high 的时候直接return NULL
但是存在 要删除节点的孩子可能并不需要删除 的情况
递归三部曲:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
// 终止条件
if(root == null) return root;
// 中
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;
}
}
本题就简单一些,可以尝试先自己做做。
题目链接/文章讲解:题目链接/文章讲解:
视频讲解:108.将有序数组转换为二叉搜索树
在二叉树:构造二叉树登场!和二叉树:构造一棵最大的二叉树 中其实已经讲过了,如何根据数组构造一棵二叉树。
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。 分割点就是数组中间位置的节点。
在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。要注意区间划分规则要一致(我们这里是左闭右闭)
// 递归 中序遍历
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null;
return travel(nums, 0, nums.length - 1);
}
public TreeNode travel(int[] nums, int left, int right){
if(left > right) return null;
int mid = left + ((right - left) >> 1); // 保险起见 统一这样写吧
TreeNode root = new TreeNode(nums[mid]);
root.left = travel(nums, left, mid - 1);
root.right = travel(nums, mid + 1, right);
return root;
}
}
本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。
题目链接/文章讲解:538.把二叉搜索树转换为累加树
视频讲解:538.把二叉搜索树转换为累加树
// 递归 右中左
class Solution {
int pre = 0; // 注意:pre一定得设为全局变量
public TreeNode convertBST(TreeNode root) {
addTree(root);
return root;
}
public void addTree(TreeNode root){
if(root == null) return;
addTree(root.right); // 右
root.val = root.val + pre; // 中
pre = root.val;
addTree(root.left); // 左
}
}