题目:
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
题解:
步骤:
1.确定递归函数的参数以及返回值
这里我们为什么需要返回值呢?
因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。
但是有返回值,更方便,可以通过递归函数的返回值来移除节点。
2.确定终止条件
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
3.确定单层递归的逻辑
三种情况:
- 如果节点数字比low小,就把左节点全部裁掉,返回右节点裁剪完的;
-
如果数字比high大,就把右节点全部裁掉,返回左节点裁剪完的;
-
如果数字在区间内,就去裁剪左右子节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null) {
return null;
}
//节点数字比low小,就把左节点全部裁掉,返回右节点裁剪完的
if (root.val < low) {
return trimBST(root.right, low, high);
}
//如果数字比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;
}
}
参考:代码随想录