LeetCode669. 修剪二叉搜索树
题目
递归思路
递归函数trimBTS的作用
trimBTS用于对传参进来的root节点进行剪枝。剪枝的范围也是根据传进来的参数。
递归返回值
- TreeNode:最终返回的是BTS的新的根节点
递归参数
- TreeNode root:当前节点
- int low:节点的最小值
- int high:节点的最大值
TreeNode trimBTS(TreeNode root, int low, int high) {}
递归结束条件
当root为空时,说明节点已经遍历完了,此时返回空。
if(root == null) return null;
单次递归逻辑
在单次递归中,处理的情况可分为三种:
-
当 root.val < low 时:
此时 root 的值小于最小边界。因为这是一颗二叉搜索树,所以 root 的左孩子都小于最小边界,都不符合要求,但是root的右孩子中可能还存在符合要求的节点。所以在这种情况下,需要对 root 的右孩子继续进行剪枝,并将剪枝后的右孩子返回上一层(即 root 的父节点)。
if(root.val < low) {
return trimBTS(root.right, low, high);
}
- 当 root.val > high 时:
同理于情况1。此时 root 的值大于最大边界,所以 root 的右孩子都不符合要求,但 root 的左孩子中可能还存在符合要求的节点。所以要将左孩子进行剪枝后返回给上一层。
if(root.val > high) {
return trimBTS(root.left, low, high);
}
- 当 root.val 满足边界要求时:
此时 root 本身是符合要求的,因此需要对 root 的左右孩子进行剪枝。剪枝完了之后将 root 返回。
root.left = trimBTS(root.left, low, high);
root.right = trimBTS(root.right, low, high);
return root;
完整代码(核心代码模式)
TreeNode trimBTS(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;
}