Java C++ 算法题解leetcode669修剪二叉搜索树示例

Java C++ 算法题解leetcode669修剪二叉搜索树示例

问题描述

给定一个二叉搜索树,同时给定区间[L,R],将BST中所有小于L的节点和大于R的节点剪枝。

解法

题目要求我们剪掉所有小于L的节点和大于R的节点,我们可以采取遍历整个二叉搜索树的方式,检查每个节点是否在指定区间[L,R]内。如果当前节点的值小于L,则需要删除当前节点的左子树中所有节点;如果当前节点的值大于R,则需要删除当前节点的右子树中所有节点;否则继续遍历左右子树。

public TreeNode trimBST(TreeNode root, int L, int R) {
    if (root == null) {
        return null;
    }
    if (root.val < L) {
        return trimBST(root.right, L, R);
    }
    if (root.val > R) {
        return trimBST(root.left, L, R);
    }
    root.left = trimBST(root.left, L, R);
    root.right = trimBST(root.right, L, R);
    return root;
}
TreeNode* trimBST(TreeNode* root, int L, int R) {
    if (root == nullptr) {
        return nullptr;
    }
    if (root->val < L) {
        return trimBST(root->right, L, R);
    }
    if (root->val > R) {
        return trimBST(root->left, L, R);
    }
    root->left = trimBST(root->left, L, R);
    root->right = trimBST(root->right, L, R);
    return root;
}

我们先判断当前节点的值是否小于L,这是因为如果节点的值小于L,那么节点的左子树中所有节点的值都会小于L,需要删除左子树的所有节点。因此,我们需要递归删除当前节点的左子树,并将当前节点的右子树作为新的根节点返回。

接下来,我们判断当前节点的值是否大于R,这是因为如果节点的值大于R,那么节点的右子树中所有节点的值都会大于R,需要删除右子树的所有节点。因此,我们需要递归删除当前节点的右子树,并将当前节点的左子树作为新的根节点返回。

如果当前节点的值在[L,R]之间,我们需要继续遍历当前节点的左右子树,并更新其左右子树的指针。

示例说明

假设当前二叉搜索树如下:

      8
     / \
    3   10
   / \    \
  1   6    14
     / \   /
    4   7 13

我们要删除二叉树中所有小于5和大于13的节点。

Java代码如下:

TreeNode root = new TreeNode(8);
root.left = new TreeNode(3);
root.right = new TreeNode(10);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(6);
root.right.right = new TreeNode(14);
root.left.right.left = new TreeNode(4);
root.left.right.right = new TreeNode(7);

Solution solution = new Solution();
TreeNode result = solution.trimBST(root, 5, 13);

System.out.println(result);

运行结果如下:

      8
     / \
    6   10
     \    \
      7    13

C++代码如下:

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int L, int R) {
        if (root == nullptr) {
            return nullptr;
        }
        if (root->val < L) {
            return trimBST(root->right, L, R);
        }
        if (root->val > R) {
            return trimBST(root->left, L, R);
        }
        root->left = trimBST(root->left, L, R);
        root->right = trimBST(root->right, L, R);
        return root;
    }
};

int main() {
    TreeNode *root = new TreeNode(8);
    root->left = new TreeNode(3);
    root->right = new TreeNode(10);
    root->left->left = new TreeNode(1);
    root->left->right = new TreeNode(6);
    root->right->right = new TreeNode(14);
    root->left->right->left = new TreeNode(4);
    root->left->right->right = new TreeNode(7);

    Solution solution;
    TreeNode *result = solution.trimBST(root, 5, 13);

    cout << result << endl;

    return 0;
}

运行结果如下:

      8
     / \
    6   10
     \    \
      7    13

从结果可以看出,我们成功删除了小于5和大于13的节点,只保留了中间的节点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++ 算法题解leetcode669修剪二叉搜索树示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解Springboot事务管理

    关于”详解Springboot事务管理”的攻略,我可以给出以下的完整解析: 什么是事务管理 事务(Transaction)是指作为一个不可分割的工作单位所需要执行的一系列操作,这些操作要么全部都执行成功,要么全部都执行失败。对于一些需要多步操作的业务中,我们需要保证其中的每一步都可以正确执行,并且在其中任何一步出错的情况下,都可以撤回所有操作以保证数据的一致…

    Java 2023年5月15日
    00
  • HttpServletRequest对象方法的用法小结

    HttpServletRequest对象是Java EE中常用的请求对象,表示一个HTTP请求,包含了请求的头部信息、参数、Cookie、Session等。下面我们来详细讲解HttpServletRequest对象方法的用法: 请求行信息 获取HTTP请求的请求URL、请求方式、协议版本、URI、参数等请求行信息,主要包含以下方法: getRequestUR…

    Java 2023年6月15日
    00
  • zookeeper实现分布式锁

    下面我将详细讲解如何使用zookeeper实现分布式锁。 什么是分布式锁? 分布式锁是一种用于控制分布式系统之间访问共享资源的机制。例如,在分布式系统中使用共享资源时,需要确保在任何时刻只有一个节点能够持有该资源。在这种情况下,分布式锁可以防止多个节点同时访问共享资源,从而保证系统的正确性和稳定性。 ZooKeeper简介 ZooKeeper是由Apache…

    Java 2023年5月20日
    00
  • Java 数据库连接池 DBCP 的介绍

    Java 数据库连接池 DBCP 的介绍 什么是数据库连接池? 在传统的JDBC开发中,每次连接数据库都要进行数据库的连接和断开操作,这样会极大地浪费系统资源和时间,尤其是在高并发的情况下。为了解决这个问题,我们可以采用连接池技术,将一些连接预先放在池子中,在需要的时候从池子中获取连接,用完后再放回池子中,避免频繁的连接和断开操作。 DBCP 是什么? DB…

    Java 2023年5月19日
    00
  • 详解MybatisPlus集成nacos导致druid连接不上数据库

    我很高兴为您提供“详解MybatisPlus集成nacos导致druid连接不上数据库”的完整攻略。 问题描述MybatisPlus集成nacos后,我们发现druid连接池无法连接数据库了,导致应用程序无法启动。这是由于Druid数据源在生成时需要使用一些配置参数,例如驱动类名、连接字符串、用户名/密码等,而这些参数在nacos配置中心中没有被正确指定。 …

    Java 2023年6月15日
    00
  • js写的评论分页(还不错)

    下面是详细的攻略: 1. 了解分页的原理 在进行评论分页之前,需要先了解分页的原理。一般来说,分页是将较大的数据集合分割成多个部分进行显示,以便用户能够更方便地浏览和查找内容。分页通常包括以下几个要素: 总记录数(total):数据集合的总条数。 每页记录数(pageSize):每页显示的的数据条数。 当前页数(currentPage):当前显示的页码。 总…

    Java 2023年6月16日
    00
  • Java中this,static,final,const用法详解

    Java中this、static、final和const用法详解 一、this关键字 1.1 this指代当前对象 在Java中,this关键字可以用来指代当前对象。它通常被用于以下情况: 在一个构造函数中,用来区分成员变量和方法参数。 在一个方法中,用来访问当前对象的成员变量或者其他方法。 下面是一个使用this关键字的简单例子: public class…

    Java 2023年5月26日
    00
  • 使用java采集京东商城行政区划数据示例

    下面是使用Java采集京东商城行政区划数据的完整攻略: 1. 准备 首先需要准备一些工具和资源,包括: JDK 1.8及以上版本 Maven IntelliJ IDEA或Eclipse Jsoup 其中,JDK是Java开发必备的工具,版本需要在1.8及以上,Maven可以管理项目中的依赖,IntelliJ IDEA/Eclipse是Java开发中常用的ID…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部