力扣刷题记录-669. 修剪二叉搜索树

目录

  • 669. 修剪二叉搜索树
    • 一、题目描述
    • 二、解题思路
      • 递归法
    • 三、AC代码
      • 递归法

669. 修剪二叉搜索树

一、题目描述

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

Alt
Alt

提示:

  • 树中节点数在范围 [1, 10^4] 内
  • 0 <= Node.val <= 10^4
  • 树中每个节点的值都是 唯一 的
  • 题目数据保证输入是一棵有效的二叉搜索树
  • 0 <= low <= high <= 10^4

二、解题思路

递归法

直接想法就是:递归处理,然后遇到 root->val < low || root->val > high 的时候直接return NULL。
然而[1, 3]区间在二叉搜索树的中可不是单纯的节点3和左孩子节点0就决定的,还要考虑节点0的右子树。
力扣刷题记录-669. 修剪二叉搜索树_第1张图片
在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图:
力扣刷题记录-669. 修剪二叉搜索树_第2张图片

三、AC代码

递归法

class Solution {

    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null) {
            return null;
        }
        if (root.val < low) {
            return trimBST(root.right, low, high);
        }
        if (root.val > high) {
            return trimBST(root.left, low, high);
        }
        // root在[low,high]范围内
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }

}

参考代码随想录:https://programmercarl.com/

你可能感兴趣的:(力扣-树,leetcode,算法,数据结构)