【leetcode题解C++】450.删除二叉搜索树中的节点 and 669.修剪二叉搜索树 and 108.将有序数组转换为二叉搜索树

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

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

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

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

示例 1:

输入: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]。

示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

思路:要是被删除的节点是叶子节点或者只有左孩子或右孩子,那么处理起来很简单。要是需要被删除的节点既有左孩子又有右孩子,就需要左进一步处理了。那么,在找到需要删除的节点后,需要把被删除节点的左子树接在被删除节点的右子树的最左叶子节点,因此,用一个节点遍历找到右子树的最左叶子节点,接上左子树。接下来,需要做的就是删除被删除节点了,root=root->right(下面代码中的delete都是可以缺省的,只是一个释放内存的操作)。

 代码实现:

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(!root) return root;if(root->val == key) {if(!root->left && !root->right) {delete root;return nullptr;}else if(!root->left) {auto ret = root->right;delete root;return ret;}else if(!root->right) {auto ret = root->left;delete root;return ret;}else {TreeNode *node = root->right;while(node->left) {node = node->left;}node->left = root->left;auto r = root;root = root->right;delete r;return root;}}if(root->val > key) root->left = deleteNode(root->left, key);if(root->val < key) root->right = deleteNode(root->right, key);return root;}
};

669. 修剪二叉搜索树

给你二叉搜索树的根节点 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]

思路:也是递归调用,首先是当走到空节点返回,针对于该被修剪的节点,在满足被剪条件后,断开这个连接(度),连接到左孩子或右孩子即可(具体看是大于范围->找左孩子,小于范围->找右孩子)。

代码实现:

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

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

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

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

示例 1:

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

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

思路1:迭代,使用三个队列,一个维护节点,另外两个维护下标(因为要建立高度平衡的二叉搜索树,那么就需要left,mid,right三个下标)

代码实现1:

class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {queue<TreeNode *>que;queue<int>rightQue;queue<int>leftQue;TreeNode *root = new TreeNode(0);que.push(root);leftQue.push(0);rightQue.push(nums.size() - 1);while(!que.empty()) {TreeNode *node = que.front();que.pop();int left = leftQue.front();leftQue.pop();int right = rightQue.front();rightQue.pop();int mid = left + ((right - left)/2);node->val = nums[mid];if(left <= mid - 1) {node->left = new TreeNode(0);que.push(node->left);leftQue.push(left);rightQue.push(mid - 1);}if(right >= mid + 1) {node->right = new TreeNode(0);que.push(node->right);leftQue.push(mid + 1);rightQue.push(right);}}return root;}
};

思路2:递归,通过递归调用不断创建和给父节点接上新节点,完成二叉搜索树的构建,很明显,如果要高度平衡,那么left,mid,right三个下标是不可少的。

代码实现2:

class Solution {
public:TreeNode* traversal(vector<int> &nums, int left, int right) {if(left > right) return nullptr;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;}TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode *root = traversal(nums, 0, nums.size() - 1);return root;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android学习之路(27) ProGuard,混淆,R8优化

前言 使用java编写的源代码编译后生成了对于的class文件&#xff0c;但是class文件是一个非常标准的文件&#xff0c;市面上很多软件都可以对class文件进行反编译&#xff0c;为了我们app的安全性&#xff0c;就需要使用到Android代码混淆这一功能。 针对 Java 的混淆&#x…

力扣383周赛第三题

本题的难点其实不在思路上&#xff0c;而是有些人遇到这种题就不想做了&#xff0c;题目太长&#xff0c;有点读不懂题。 只要先耐心下来把题读懂之后这题其实就没那么难了&#xff0c;读懂题之后还有一个关键点就是&#xff0c;我们怎么在1e8时间复杂度之内跑过呢&#xff1f…

问题:以下关于搜索OCPC说法错误的是()? #知识分享#知识分享#媒体

问题&#xff1a;以下关于搜索OCPC说法错误的是&#xff08;)&#xff1f; A&#xff0e;OCPC进入第二阶段&#xff0c;不能随意更换转化目标和页面 B&#xff0e;OCPC可以直接跳过第一阶段&#xff0c;直接开始跑第二阶段 C&#xff0e;开启OCPC计划后&#xff0c;系统就会…

Flink生产环境常见问题及解决方法

在Flink生产环境中&#xff0c;可能会遇到一些常见的问题。下面简单的介绍几个常见问题&#xff0c;并且提供一些解决方法&#xff0c;来帮助你更好地应对这些问题。 故障转移和高可用性 Flink提供了故障转移和高可用性机制&#xff0c;但在配置和使用时可能会遇到问题。如果…

Linux 网络编程 + 笔记

协议&#xff1a;一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层TCP/IP 4层模型&#xff1a;链路层/网络接口层、网络层、传输层、应用层 应用层&#xff1a;http、ftp、nfs、ssh、telnet、传输层&am…

过年前想要便宜寄快递,究竟还有什么渠道呢?

马上就是年关了&#xff0c;心情显得异常激动了&#xff0c;想到马上就可以吃到团圆的年夜饭了&#xff0c;小编和大家都是非常的开心了&#xff0c;还有春节期间的旅游&#xff0c;探亲&#xff0c;都是值得期待的事情了&#xff0c;亲戚朋友&#xff0c;邻里邻居之间会互相送…

python 视频硬字幕去除 内嵌字幕去除工具vsr

项目简介 开源地址&#xff1a;https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术&#xff0c;将视频中的硬字幕去除的软件。 主要实现了以下功能&#xff1a; 无损分辨率将视频中的硬字幕去除&#xff0c;生成去除字幕后…

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

字符串左旋

题目&#xff1a;字符串左旋 内容&#xff1a;实现一个函数&#xff0c;可以左旋字符串中的K个字符。 例如&#xff1a; ABCDEF左旋一个字符可以得到BCDEFA ABCDEF左旋两个字符可以得到CDEFAB 方法一&#xff1a;移动字符 #include <stdio.h> #include <string.h>c…

Faster-RCNN 和 Mask-RCNN详解

Faster-RCNN &#xff0c;Mask-RCNN原理 一、摘要1.1 图像分割1.2 语义分割与实例分割 二、Faster-RCNN2.1 Faster-RCNN模型架构2.2 &#x1f34a;深度卷积网络&#xff08;backbone&#xff09;2.3 &#x1f34e;RPN&#xff08;Region Proposal Network&#xff09;2.4 &…

VS2019 添加程序包

dotnet add package AlibabaCloud.SDK.Bailian20230601 来提示添加程序包 选择菜单栏 项目----管理NuGet程序包 输入程序包的名称&#xff0c;然后添加即可&#xff0c; 这只是给当前工程添加&#xff0c;并不是给VS添加&#xff0c;所以你打开新工程&#xff0c;需要使用的话…

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://sc…