669. 修剪二叉搜索树

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

669. 修剪二叉搜索树

题目分析

给出一个二叉搜索树和最小边界low和最大边界high,通过修剪二叉搜索树,使所有的节点值在[low,high]区间之内。返回结果,并且结果是一棵二叉搜索树。

解题

首先来考虑递归的三要素:

  1. 参数和返回值

参数为节点和边界值,也就是low和high,返回值与上两个程序(二叉搜索树中的插入二叉搜索树中的删除)相似,都是使用返回值来移除节点。

  1. 终止条件

终止条件是遇到空节点就可以返回。

  1. 单层循环的逻辑

如果当前节点的元素小于左边界的数值,那么根据二叉搜索树的性质。应该递归右子树返回右子树符合条件的节点。这里不能简单的直接将整个节点以及它的子节点都删除,因为虽然根节点小于边界值,但是根节点的右子节点大于根结点,所以也可能在边界范围中。

同样的当当前节点的元素大于右边界时递归左子树返回左指数符合条件的头结点。

接下来只需要将处理完两边指数的结果赋值给左子树和右子树返回根结点即可。

理解了这些要素后,递归的语法其实并不困难,一定可以看懂的。

代码如下:

var trimBST = function(root, low, high) {
    if(root === null) return null
    if(root.val < low) {
        let right = trimBST(root.right,low,high)
        return right
    }
    if(root.val > high) {
        let left = trimBST(root.left,low,high)
        return left
    }
    root.left = trimBST(root.left,low,high)
    root.right = trimBST(root.right,low,high)
    return root
};

总结

目前只理解了递归的做法,不过好在坚持住了,即将走过二叉树,很开心。