目录
669. 修剪二叉搜索树
题目描述
解题思路
删的节点不止一个
终止条件:最下层递归的当前节点是空值返回null
单层递归逻辑:再往上递归(也就是除了最顶层的中间层)的修剪条件有两种
1. 当前节点不满足范围的下界。需要检查(递归遍历)其右子树(二叉搜索树的性质会导致有可能右子树比下界大因此满足范围);
2. 当前节点不满足范围的上界。同理则检查其左子树;
中间层递归完了到最上层即整个二叉树的根节点:
分别接住中间层递归完返回的左右子树情况
代码
终止条件【算是先处理完下层的修剪条件【递归往上返回到中间层】】:
当前节点是空值则返回null【最下层递归也就是终止条件】
单层递归逻辑(包括中间层和最顶层)【处理完了下面的层级,再往最上层根节点返回】:
如果当前节点值小于修剪范围的左区间,则往右子树递归遍历(if (root.val < low) traversal(root.right, low, high))【为什么要往右子树遍历是因为有可能当前节点虽然自己不满足,但是因为二叉搜索树的性质右子树大于当前节点值,因此有可能是大于修剪范围的左区间以检查是否有右子树的节点满足】,那么需要返回的是root.right(因为是当前节点的右子树有可能满足)
同理如果当前节点值大于修剪范围的右区间,则往左子树递归遍历
将下层根据修剪条件修剪完的左右子树分别递归遍历完返回给整个二叉树的根节点:左子树用左子结点接着往左子树递归遍历的值(root.left = traversal(root.left, low, high));同理右子树也是
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
// 终止条件(最下层):当前节点为空值则返回空值
if (root == null) return null;
// 单层递归逻辑(中间层):
// 1. 如果当前节点值小于修剪范围的下界
if (root.val < low) {
// 则递归遍历右子树,因为有可能右子树存在大于下界的节点
return trimBST(root.right, low, high);
}
// 2. 如果当前节点值大于修剪范围的上界
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;
}
}