修剪二叉搜索树
题目详细:LeetCode.669
做这道题之前建议先看视频讲解,没有想象中那么复杂:代码随想录—修剪二叉搜索树
由题可知,需要删除节点值不在区间内的节点,所以可以得到三种情况:
- 情况一:root.val < low
- 情况二:root.val > high
- 情况三:low < root.val < high
- 当节点满足情况一和情况二的条件时,删除该节点
但被删除节点的子树可能存在值在区间内的节点,利用二叉搜索树的特点可得:
- 情况一:root.val < low,root左子树上的节点值都比root.val小,右子树上的节点值都比root.val大,所以满足区间的节点只会在右子树上出现,递归修剪其右子树并返回新的子节点
- 情况二:root.val > high,root左子树上的节点值都比root.val小,右子树上的节点值都比root.val大,所以满足区间的节点只会在左子树上出现,递归修剪其左子树并返回新的子节点
- 情况三:low < root.val < high,说明当前节点不需要被删除,递归修剪其左右子树,返回修剪好的二叉搜索树的新的根节点
Java解法(递归):
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(null == root) return null;
// 根据二叉搜索树的特点可知
if(root.val < low){
// 删除节点的右子树中可能存在值在区间内的节点
// 返回修剪好的右子树的新的子节点
return trimBST