题目

类型:二叉树、DFS
image.png

解题思路

二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「分解问题」的思维。

首先要注意题目说这是二叉搜索树,如果一个节点的值没有落在 [lo, hi] 中,有两种情况:
1、root.val < lo,这种情况下 root 节点本身和 root 的左子树全都是小于 lo 的,都需要被剪掉。
2、root.val > hi,这种情况下 root 节点本身和 root 的右子树全都是大于 hi 的,都需要被剪掉。

代码

  1. public class TrimABinarySearchTree {
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. * int val;
  6. * TreeNode left;
  7. * TreeNode right;
  8. * TreeNode() {}
  9. * TreeNode(int val) { this.val = val; }
  10. * TreeNode(int val, TreeNode left, TreeNode right) {
  11. * this.val = val;
  12. * this.left = left;
  13. * this.right = right;
  14. * }
  15. * }
  16. */
  17. /**
  18. * 删除 BST 中小于 low 和大于 high 的所有节点,返回结果 BST
  19. * @param root
  20. * @param low
  21. * @param high
  22. * @return
  23. */
  24. public TreeNode trimBST(TreeNode root, int low, int high) {
  25. if (root == null) return null;
  26. if (root.val < low) {
  27. // 直接返回 root.right
  28. // 等于删除 root 以及 root 的左子树
  29. return trimBST(root.right, low, high);
  30. }
  31. if (root.val > high) {
  32. // 直接返回 root.left
  33. // 等于删除 root 以及 root 的右子树
  34. return trimBST(root.left, low, high);
  35. }
  36. // 闭区间 [lo, hi] 内的节点什么都不做
  37. root.left = trimBST(root.left, low, high);
  38. root.right = trimBST(root.right, low, high);
  39. return root;
  40. }
  41. }