LeetCode 669 修剪二叉搜索树 -- 递归法和迭代法

news/2024/7/20 22:52:40 标签: leetcode, 算法, 深度优先

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree


题意:

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

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

示例 1:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

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


参考文章

思路:

先说递归法的做法:

递归法,需要先确定递归方法的参数、返回值。在这道题中其实涉及到了二叉树重构的问题,所以借助递归方法返回节点的形式,可以简化代码。

  • 当遍历到的当前节点小于最低值,那么它的左子树中的节点也都小于最低值,我们直接遍历到它的右子树中。
  • 同理,当遍历到的当前节点大于最大值,那么它的右子树中的节点也都大于最低值,我们直接遍历到它的左子树中。
  • 如果当前节点的值在范围内,那么这个节点是要保留的,我们对它的左右子树都进行一个遍历看看有无需要重构的地方,最后再将当前节点返回

递归法 Java代码:

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.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

下面是迭代法的思路:

首选我们将root调整为在范围中的节点,接着再分别对root的左右子树中不在范围内的节点进行剪切。

那么如何进行剪切呢?

如果是遍历到当前节点,对当前节点是否在范围内进行判断,如果不在范围内,则要舍弃当前节点,这样子做的话,需要记录当前节点的父节点(在别的题目中可能还要记录当前节点是父节点的左节点还是右节点),这样子做会比较麻烦。

那么我们干脆就对当前节点的儿子节点是否需要进行剪切进行判断,如果当前节点的儿子节点不在范围内,我们就直接使用儿子节点的儿子节点来替换当前节点的儿子节点(没想到说起来还有点绕)。这样子做,在剪切操作上就来的方便多了!

迭代法 Java代码:

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        //先调整root到范围内
        while (root != null && (root.val < low || root.val > high)) {
            if (root.val < low) root = root.right;
            else root = root.left;
        }
        TreeNode cur = root;
        //剪掉root左子树中不在范围内的节点
        while (cur != null) {
            while (cur.left != null && cur.left.val < low) cur.left = cur.left.right;
            cur = cur.left;
        }
        cur = root;
        //剪掉root右子树中不在范围内的节点
        while (cur != null) {
            while (cur.right != null && cur.right.val > high) cur.right = cur.right.left;
            cur = cur.right;
        }
        return root;
    }
}

http://www.niftyadmin.cn/n/1803106.html

相关文章

Django学习:模板继承和配置静态文件

一、模板继承 目的是&#xff1a;减少代码的冗余 语法&#xff1a; {% block classinfo %}{% endblock %} 具体步骤&#xff1a; 1、创建一个base.html文件&#xff0c;2、把要显示的页面的内容写在这里面&#xff0c;也就是html要在浏览器显示的内容3、在right里面写个盒子  …

Python编程Day4——if判断、while循环、for循环

一、if判断 语法一&#xff1a; if条件&#xff1a; 代码块1 代码块2 代码块3 1 示例&#xff1a;2 sexfemale3 age184 is_beautifulTrue5 if sex femaleand age>16 and age<20 and is_beautiful:6 print(开始表白。。。)7 else:8 print(阿姨好。。。…

LeetCode 108 将有序数组转换为二叉搜索树 -- 递归法

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree 题意&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度…

linux shell 命令

1. linux 遍历目录 列出文件 for var in $(ls); do echo $var; fileNumecho $var | grep -P -o ([0-9]); mv $var "$fileNum.png"; done 转载于:https://www.cnblogs.com/whm-blog/p/10577694.html

记一次因证书问题导致请求失败问题SSLHandshakeException

记一次因证书问题导致请求失败问题SSLHandshakeException 转载请注明出处&#xff1a;https://www.cnblogs.com/funnyzpc/p/10989813.html 最近接一外部接口&#xff0c;接口在本地开发调试及测试都无任何问题(windows下)&#xff0c;而上测试环境后测第一次就直接报错误&#…

LeetCode 77 组合 -- 回溯法

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/combinations 题意&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a…

P1078 文化之旅[最短路]

题目背景 本题是错题&#xff0c;后来被证明没有靠谱的多项式复杂度的做法。测试数据非常的水&#xff0c;各种玄学做法都可以通过&#xff08;比如反着扫&#xff09;&#xff0c;不代表算法正确。因此本题题目和数据仅供参考。 题目描述 有一位使者要游历各国&#xff0c;他每…

swiper轮播图设置每组显示的个数及自定义slide宽度

一、html演示代码&#xff1a; 1 <div class"swiper-container">2 <div class"swiper-wrapper">3 <div class"swiper-slide">Slide 1</div>4 <div class"swiper-slide">Slide 2<…