思路
由于是一个二叉搜索树,所以不会出现左右子节点都满足条件但是根节点不满足条件的情况。
因此,针对一棵二叉搜索树的修剪,满足以下条件:
- 如果当前节点是null,直接返回即可。
- 如果当前节点的值小于low,则当前节点和右子树都被修剪掉,仍需要继续修剪左子树,最后将修剪的结果返回
- 如果当前节点的值大于hign,则当前节点和左子树都被修剪掉,仍需要继续修剪右子树,最后将修剪的结果返回
- 如果当前节点的值大于等于low小于等于high,则该节点需要保留,仍需要继续修剪其左右子树,最后将修剪的结果返回
代码如下:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
//1. 先找根节点
TreeNode newRoot = root;
while(newRoot != null && (newRoot.val < low || newRoot.val > high)){
if(newRoot.val < low){
newRoot = newRoot.right;
} else {
newRoot = newRoot.left;
}
}
if(newRoot == null){
return null;
}
//2. 从新的根节点找它的左右***节点
newRoot.left = trimBST(newRoot.left, low, high);
newRoot.right = trimBST(newRoot.right, low, high);
return newRoot;
}
}