【算法系列之二叉树IV】leetcode450.删除二叉搜索树中的节点

news2024/11/22 12:07:39

701.二叉搜索树中的插入操作

力扣题目链接

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]

解题思路

  1. 如果当前节点为空,直接插入。如果值比当前节点的值大,新增节点在右子树上,比当前节点值小,新增节点在左子树上。

Java实现

递归方式

class Solution_LC701 {

    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (root.val > val) {
            root.left = insertIntoBST(root.left, val);
        }
        if (root.val < val) {
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }
}

非递归方式

public class Solution_LC701_II {

    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        TreeNode cur = root;
        TreeNode pre = null;
        while (cur != null) {
            pre = cur;
            if (cur.val > val) {
                cur = cur.left;
            } else if (cur.val < val) {
                cur = cur.right;
            }
        }
        if (pre.val > val) {
            pre.left = new TreeNode(val);
        }
        if (pre.val < val) {
            pre.right = new TreeNode(val);
        }
        return root;
    }
}

450.删除二叉搜索树中的节点

力扣题目链接

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。
输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

解题思路

  1. 如果当前节点是要被删除的节点,判断其左右子节点是否为空。如果左右不节点不为空,将左子树放在右子树的最左边
  2. 如果被删除的节点在左子树上,因为递归函数返回的是左子树的根节点,root.left = deleteNode(root.left, key)

Java实现

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) {
            return null;
        }
        if (root.val == key) {
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            } else {
                TreeNode tmp = root.right;
                while (tmp.left != null) {
                    tmp = tmp.left;
                }
                tmp.left = root.left;
                root = root.right;
                return root;
            }

        }
        if (root.val < key) {
            root.right = deleteNode(root.right, key);
        }
        if (root.val > key) {
            root.left = deleteNode(root.left, key);
        }
        return root;
    }
}

669. 修剪二叉搜索树

力扣题目链接

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

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

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

解题思路

  1. 判断当前节点的值比hign要大,那么可以直接删除,直接用递归左子树的结果。
  2. 如果当前节点的值在low和high之间,那么对左子树和右子树分别清除,返回当前节点。

Java实现

class Solution_LC669 {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null) {
            return null;
        }
        if (root.val > high) {
            return trimBST(root.left, low, high);
        }
        if (root.val < low) {
            return trimBST(root.right, low, high);
        }
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

108.将有序数组转换为二叉搜索树

力扣题目链接

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

解题思路

  1. 构造二叉树。对数组进行切分,左边是左子树,右边是右子树。

Java实现

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return traversal(nums, 0, nums.length - 1);
    }

    private TreeNode traversal(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }
//        int mid = (left + right) / 2;
        int mid = left + (right - left) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = traversal(nums, left, mid - 1);
        root.right = traversal(nums, mid + 1, right);
        return root;
    }
}

538.把二叉搜索树转换为累加树

力扣题目链接

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

**注意:**本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

解题思路

  1. 每个节点 node 的新值等于原树中大于或等于 node.val的值之和。。想要的效果就是最大的数是不需要增加数值的,次大的数需要新增最大的数,来设置新值。
  2. 对于二叉树的修改,就是设置新值。新值的计算用变量存储。
  3. 遍历顺序很关键。从右子树先计算。

Java实现

class Solution {
    int sum = 0;

    public TreeNode convertBST(TreeNode root) {
        dfs(root);
        return root;
    }

    private void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        sum += root.val;
        root.val = sum;
        dfs(root.right);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell之免交互

一.免交互&#xff08;Here Document&#xff09;介绍 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个“文件”…

chatgpt赋能python:Python在主程序中进行函数调用

Python在主程序中进行函数调用 介绍 Python是一种广泛使用的高级编程语言&#xff0c;它在创建Web应用程序、网络服务器、数据分析、机器学习等多个领域中表现出色。在Python中&#xff0c;函数是编程中最重要的概念之一&#xff0c;函数调用是指程序员在主程序中调用一个或多…

系统移植-uboot

目录 一、安装系统 1.移植的目的 2.系统移植过程 Windows装机 Linux系统移植 3.开发板启动过程 二、Uboot概述 1.Bootloader简介 Bootloader基本功能 uboot工作方式 三、SD卡存储结构 一、安装系统 在基于ARM处理器的开发板上安装Linux系统 1.移植的目的 不…

docker版jxTMS使用指南:python服务之设备策略

本文讲解4.0版的jxTMS中python服务的设备策略&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.0版升级内容 docker版本的使用&#xff0c;请参考&#xff1a;docker版jxTMS使用指南 jxTMS实现的接口机对设备的数据采集与处理采取的是框架组…

Elastic Stack 和 Docker-Compose 入门

作者&#xff1a;Eddie Mitchell 随着 Elastic Stack 多年来的发展和功能集的增加&#xff0c;在本地开始或尝试概念验证 (POC) 的复杂性也越来越高。 虽然 Elastic Cloud 仍然是开始使用 Elastic 最快、最简单的方式&#xff0c;但对本地开发和测试的需求仍然非常丰富。 作为开…

【生成任务下推生成子工序生产计划,无法结单】

今天&#xff0c;车间反馈了一个问题&#xff0c;bpm结单报错。 原先定的流程是&#xff0c;生产任务单审批流程走完之后&#xff0c;下推到MES&#xff0c;生产子工序生产计划。 这个审批流最后要到制品&#xff0c;这个工单做完了&#xff0c;制品也包装好了&#xff0c;流程…

用于改进筛查的乳腺癌异常检测

介绍 乳腺癌是一种严重的疾病&#xff0c;影响着全世界数以百万计的妇女。即使医学领域有了进步&#xff0c;对乳腺癌进行识别和治疗是可能的&#xff0c;但发现它并在早期阶段治疗它仍然是不可能的。 通过使用异常检测技术&#xff0c;我们可以识别出乳腺癌中肉眼可能看不到的…

STM32——关于EXTI讲解及标准库应用(基础篇)

简介&#xff1a; STM32的中断包括EXTI外部中断、TIM定时器、ADC模数转换器、USART串口&#xff0c;SPI通信、I2C通信等一系列的外设。这篇主要来讲解关于EXTI外部中断的概念和应用。EXTI&#xff08;External Interrupt&#xff09;是一个非常重要的外部中断模块&#xff0c;…

chatgpt赋能python:Python多条图形绘制在一张图里的实现方法及应用

Python多条图形绘制在一张图里的实现方法及应用 作为一款优秀的编程语言&#xff0c;Python在数据可视化方面有着非常出色的表现。然而有时候我们需要在一张图里绘制多条不同的图形&#xff0c;这时候Python又有什么好的解决方案呢&#xff1f;本文将介绍多种方法实现Python在…

10个最流行的可生成图像嵌入向量的预训练AI模型

迁移学习的出现进一步加速了计算机视觉——图像分类用例的快速发展。 在大型图像数据集上训练计算机视觉神经网络模型需要大量的计算资源和时间。 幸运的是&#xff0c;通过使用预训练模型可以缩短时间和资源。 利用预训练模型的特征表示的技术称为迁移学习。 预训练通常使用高…

《MySQL(三):基础篇- 函数》

文章目录 3. 函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 3. 函数 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中 已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应…

Vue.js 中的响应式原理是什么?

Vue.js 中的响应式原理是什么&#xff1f; Vue.js 是一种流行的前端框架&#xff0c;它使用了一种称为“响应式”的技术来实现数据绑定。这意味着当数据发生变化时&#xff0c;Vue.js会自动更新相关的视图&#xff0c;而无需手动操作DOM。在本文中&#xff0c;我们将深入探讨V…

【SCI征稿】Elsevier旗下中科院2区TOP, 仅1周见刊, 6月11日截稿 (文末有好)~

一、【期刊简介】 中科院2区智能计算类SCI (TOP/6.11截稿) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3-5个月左右录用&#xff1b; 【检索情况】SCI&EI双检&#xff1b;正刊&#xff1b; 【数据库收录年份】2001年…

RHCE练习题目【更新至】

文章目录 第一题、安装和配置ansible第二题、创建和运行ansible临时命令第三题、使用剧本安装软件包第四题、使用RHEL系统脚色第一问、配置时间同步第二问、配置selinux 第五题、使用Ansible Galaxy安装角色第六题、创建和使用角色第七题、从Ansible Galaxy使用角色第八题、创建…

一文搞定国民N32G435高负载串口通信

副标题&#xff1a;USRAT无硬件双缓冲条件下的软件双缓冲 一、前言 在单片机中&#xff0c;USART的通信一般都是最常用也最先去接触的串口外设&#xff0c;在一般的小数据量应用中一般不需要考虑USART串口&#xff08;以下简称为串口&#xff09;的高负载能力&#xff0c;比如…

第六十五天学习记录:高等数学:函数与极限(宋浩板书)

C语言学习后&#xff0c;曾为先学C还是数据结构纠结了半天。在看数据结构前言的时候&#xff0c;发现学习数据结构之前还需要一定的数学基础。虽然涉及到的数学基础不多&#xff0c;但想到以前大学高数&#xff0c;现代不是60分万岁就是不到80分&#xff0c;好像就概率论稍微了…

【Python】Python系列教程-- Python3 循环语句(十七)

文章目录 前言while 循环无限循环while 循环使用 else 语句简单语句组for 语句for...elserange() 函数break 和 continue 语句及循环中的 else 子句pass 语句 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境…

Treap C++代码实现

一、全部代码 #include <iostream> #include <cstdlib> #include <time.h>using namespace std;//Treap结构 struct TreapNode {TreapNode *pLeft, *pRight;int value, fix; };//左旋 void TreapLeftRotate(TreapNode* &pCur){//首先&#xff0c;找到当…

平衡树原理讲解

平衡树——Treap 文章目录 平衡树——TreapBST定义性质操作插入insert(o, v)删除del(o, v)找前驱 / 后继get_prev(o)、get_next(o)查找最大 / 最小值get_min(o)、get_max(o)求元素排名get_rank(o)查找排名为 k k k的元素get_value_by_rank 平衡树左旋、右旋zag(o)、zig(o)左旋右…

Vue路由(vue-router)详细讲解指南

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向&#xff0c;就是我在页面上点击一个按钮需要跳转到对应的页面&#xff0c;这就是路由跳转&#xff1b; 首先我们来学习三个单词&…