[LeetCode]669. 修剪二叉搜索树(java实现)
1. 题目
2. 读题(需要重点注意的东西)
由于二叉树是递归定义的,因此,绝大多数的二叉树的题目,都可以考虑使用递归法来求解。
由于二叉搜索树有如下性质—即左子树的节点都比根节点小,右子树的节点都比根节点大,因此当根节点的值小于最小值的时候(root.val < low),可以直接剪掉所有左子树;当根节点的值大于最大值的时候(root.val > high),可以直接剪掉所有右子树。
还有一个需要注意的点,就是递归法思想的理解,即站在当前节点,左子树和右子树都是已知的,即在这道题里,用递归法考虑,站在当前节点时,左子树为剪裁过的左子树(trimBST(root.left,low,high)),右子树为剪裁后的右子树(trimBST(root.right,low,high)),他们都是默认已知的(root.left = trimBST(root.left,low,high); root.right = trimBST(root.right,low,high);),再根据题意,分类讨论可能性即可。
3. 解法
解法:递归法
/**
* 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;
* }
* }
*/
// BST:二叉搜索树,其根节点大于等于左孩子,小于等于右孩子
// 修剪二叉搜索树即删除给定范围外的节点
// 递归法
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return null;
// 递归的前置条件,左右子树都已知(已裁剪过)
root.left = trimBST(root.left,low,high);
root.right = trimBST(root.right,low,high);
// 若当前节点值小于最小值,剪裁整个左子树,即返回它的右子树
if(root.val < low) return trimBST(root.right,low,high);
// 若当前节点值大于最大值,剪裁整个右子树,即返回它的左子树
if(root.val > high) return trimBST(root.left,low,high);
return root;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
递归法
6. 总结
该题主要读清题意,即每次剪裁都可以剪裁掉整个左子树或者右子树,然后要掌握理解递归法的算法思想,然后从而解题的方法就变得清晰了起来,用递归法实现,代码也会十分简洁。