代码随想录:二叉树29-30

devtools/2024/9/23 7:51:03/

目录

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

题目

代码(迭代法走一边)

代码(递归法走一边)

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

题目

代码(递归法走一边)


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

题目

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

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

示例 1:

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

代码(迭代法走一边)

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {TreeNode pre = null;TreeNode cur = root;//如果树为空,单独处理(这个不能漏,不然后面pre.val编译会出错)if(root == null){return new TreeNode(val);}//不断进行左右子树判断,使得pre指向插入节点的父节点,cur正好为nullwhile(cur != null){if(cur.val > val){pre = cur;cur = cur.left;}else if(cur.val < val){   //注意这里必须有else,不然会出错因为cur会改变pre = cur;cur = cur.right;}}TreeNode newNode = new TreeNode(val);//如果父节点小,就往左子树插入if(pre.val > val){pre.left = newNode;}//如果父节点大,就往右子树插入else{pre.right = newNode;}return root;  //返回根节点}
}

代码(递归法走一边)

class Solution {//遍历的逻辑是自上而下,根据val的大小往一个左or右子树走public TreeNode insertIntoBST(TreeNode root, int val) {//终止条件,说明root已经走到插入元素的节点位置了if(root == null){return new TreeNode(val);}//走一边的单层逻辑if(root.val > val){root.left = insertIntoBST(root.left,val); //插在左子树上,修改左子树}else if(root.val < val){root.right = insertIntoBST(root.right,val);  //插在右子树上,修改右子树}return root;  //返回中间节点}
}

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

题目

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

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

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]

代码(递归法走一边)

class Solution {public TreeNode deleteNode(TreeNode root, int key) {//终止条件if(root == null){return null;}//走一边单层逻辑(自上而下递归)//如果key比root中值小,说明要修改左子树,往左子树走if(root.val > key){root.left = deleteNode(root.left,key); //修改左子树指针 }//如果key比root中值大,说明要修改右子树,往右子树走if(root.val < key){root.right = deleteNode(root.right,key); //修改右子树指针}//如果key等于root中值,说明找到了删除节点if(root.val == key){//情况1:删除节点root是叶子节点if(root.left == null && root.right == null){return null;  //返回null,代表直接删除root}//情况2:删除节点root只有左子树else if(root.left != null && root.right == null){return root.left;  //返回其左子树,代表删除了root}//情况3:删除节点root只有右子树else if(root.left == null && root.right != null){return root.right; //返回其右子树,代表删除了root}//情况4:删除节点root有左右子树else{TreeNode cur = root.right;  //cur是删除节点的右孩子while(cur.left != null){cur = cur.left;  //cur一直走到最左下节点}cur.left = root.left;  //把删除节点的左子树挂到删除节点右子树的最左下角return root.right; //返回其右子树,代表删除了root,且删除节点的左子树已经挂到右子树了}}return root;  //返回根节点}
}


http://www.ppmy.cn/devtools/22411.html

相关文章

Python快速入门1数据类型(需要具有编程基础)

数据类型&#xff1a; Python 3.0版本中常见的数据类型有六种&#xff1a; 不可变数据类型可变数据类型Number&#xff08;数字&#xff09;List&#xff08;列表&#xff09;String&#xff08;字符串&#xff09;Dictionary&#xff08;字典&#xff09;Tuple&#xff08;元…

Hive判空函数 COALESCE 和 NVL 使用示例

Hive判空函数 COALESCE 和 NVL 使用示例 1. 在Hive中&#xff0c; COALESCE 和 NVL 函数都是用于处理NULL值的函数&#xff0c;以下是它们的用途总结&#xff1a; COALESCE&#xff1a; COALESCE 函数用于返回参数列表中第一个非NULL的数值或表达式。语法&#xff1a; COALESC…

使用 Flask、Gunicorn 与 Shell 脚本构建高效 Web 应用部署流程

在使用 Flask 作为 Web 应用框架&#xff0c;并使用 Gunicorn 作为 WSGI 容器&#xff0c;使用shell 脚本来管理应用的启动、重启和停止。 启动脚本 start.sh&#xff1a; #!/bin/bash# 设置应用名称和端口 APP_NAME"my_flask_app" PORT8000# 设置 Flask 应用的路径…

XTuner微调实践

本文采用XTuner进行对InterLM2-Chat-1.8B模型的微调实践。 Xtuner工具介绍&#xff1a; Xtuner是一款由上海人工智能实验室开发的低成本大模型训练和微调工具箱&#xff0c;它的特点是以配置文件的形式封装了大部分微调场景。 Xtuner支持多种微调策略,如增量预训练和指令跟随微…

宝塔面板开启Nginx缓存为网站提速

fastcgi_cache介绍 Nginx默认自带的fastcgi_cache模块能把动态页面缓存起来&#xff0c;提高网站速度和降低服务器负载。 当有用户请求相同的页面时&#xff0c;Nginx可以直接返回缓存的页面&#xff0c;而不需要再次访问后端服务器。 这个模块可以通过简单的配置实现,还支持…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦&#xff0c;使得二者可以独立变化。 2、实现思路 使用桥接模式&#xff0c;一定要找到这个类中两个变化的维度&#xff1a;如支…

Android如何使用XML自定义属性

1、定义 在res/values文件下定义一个attrs.xml文件&#xff0c;代码如下: 2、使用 在布局中使用&#xff0c; 示例代码如下&#xff1a; 3、获取 最终来到这里&#xff1a;

ubuntu安装Anaconda安装及conda使用

一. 安装anaconda3详细教程 1、下载镜像 清华大学开源软件镜像站下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下拉到最低端选择Linux&#xff0c;选择最新版&#xff08;32/64位&#xff09;下载。这里我下载的是版本Anaconda3-4.3.30-Linux…