题目地址(669. 修剪二叉搜索树)

https://leetcode-cn.com/problems/trim-a-binary-search-tree/

题目描述

  1. 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。
  2. 所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
  3. 示例 1
  4. 输入:root = [1,0,2], low = 1, high = 2
  5. 输出:[1,null,2]
  6. 示例 2
  7. 输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
  8. 输出:[3,2,null,1]
  9. 示例 3
  10. 输入:root = [1], low = 1, high = 2
  11. 输出:[1]
  12. 示例 4
  13. 输入:root = [1,null,2], low = 1, high = 3
  14. 输出:[1,null,2]
  15. 示例 5
  16. 输入:root = [1,null,2], low = 2, high = 4
  17. 输出:[2]
  18. 提示:
  19. 树中节点数在范围 [1, 104]
  20. 0 <= Node.val <= 104
  21. 树中每个节点的值都是唯一的
  22. 题目数据保证输入是一棵有效的二叉搜索树
  23. 0 <= low <= high <= 104

前置知识


公司

  • 暂无

思路

  1. root.val < lo,这种情况下 root 节点本身和 root 的左子树全都是小于 lo 的,都需要被剪掉。
  2. root.val > hi,这种情况下 root 节点本身和 root 的右子树全都是大于 hi 的,都需要被剪掉。

    关键点


代码

  • 语言支持:Java

Java Code:

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode trimBST(TreeNode root, int low, int high) {
  18. //递归中止条件
  19. if (root == null) {
  20. return null;
  21. }
  22. //在区间外 删除小于low的节点的左子树 大于high的节点的右子树
  23. if (root.val < low) {
  24. //如果root小于low 就删除左子树以及他本身 也就是直接返回右子树的节点
  25. return trimBST(root.right, low, high);
  26. }
  27. if (root.val > high) {
  28. //同样的 如果root大于high 就删除右子树以及他本身 也就是直接返回左子树的节点
  29. return trimBST(root.left, low, high);
  30. }
  31. //在区间内 什么都不干 继续递归
  32. root.left = trimBST(root.left, low, high);
  33. root.right = trimBST(root.right, low, high);
  34. return root;
  35. }
  36. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:669. 修剪二叉搜索树 - 图1#card=math&code=O%28n%29&id=IoVCu)
  • 空间复杂度:669. 修剪二叉搜索树 - 图2#card=math&code=O%28n%29&id=SPB04)