LeetCode 669. Trim a Binary Search Tree(修剪二叉搜索树)
题目:
如何去看待修剪这个说法:
修剪即去掉那些不在范围内的节点,那么我们是不是可以理解为调整节点之间的引用关系,把这个“修剪”的过程和递归联系起来。
调整引用关系的思路:
递归的节点不满足条件的情况:这是类似于递归查找的部分,如果当前root的值不满足条件,那么就会放弃这个节点的值,若它小于L,就去当前节点的右节点去找,如果它大于R,就去当前节点的左节点去找。当找到一个在范围内的节点,是会通过这个多级的引用传递返回过来的。
if(root==null){
return null;
}else if(root.val<L){
return trimBST(root.right, L, R);
}else if(root.val>R){
return trimBST(root.left, L , R);
}
递归节点满足条件的情况:这是递归代码的下一个部分,如果当前节点的值在范围内,那么就返回把当前节点做和之前的根节点一样的事情,然后返回当前节点的引用。
root.left=trimBST(root.left, L , R);
root.right=trimBST(root.right, L, R);
return root;
完整代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public TreeNode trimBST(TreeNode root, int L, int R) {
if(root==null){
return null;
}else if(root.val<L){
return trimBST(root.right, L, R);
}else if(root.val>R){
return trimBST(root.left, L , R);
}
root.left=trimBST(root.left, L , R);
root.right=trimBST(root.right, L, R);
return root;
}
}