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

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

1,首先找到需要删除的节点;
2,如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。

这道题目是一道二叉搜索树的题目,这个题需要考虑多种情况,因为一旦删除一个节点后影响的可能就是该节点下面的所有节点,非常麻烦,看着就很头大,下面是可能的几种情况:

  1. 没找到删除的节点,遍历到空节点直接返回了
  2. 找到删除的节点,左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
  3. 找到删除的节点,删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  4. 找到删除的节点,删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  5. 左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

这五种情况最复杂的还是第五种,因为要操作的节点数目最多;
其实只要实现了这几点就没有什么难度了;
代码有注释,代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:TreeNode* deleteNode(TreeNode* root, int key) {if (!root) return root;//情况1if (root->val == key) {//情况2在情况3,4就概括了if (!root->left) return root->right;//情况3else if (!root->right) return root->left;//情况4else { //情况5TreeNode* node = root->right;//遍历到右子树的最左节点while (node->left) {node = node->left;}//最左节点接上左子树node->left = root->left;root = root->right;//删除该节点,即用右子树覆盖return root;}}if (key < root->val) root->left = deleteNode(root->left, key);if (key > root->val) root->right = deleteNode(root->right, key);return root;}
};

450. 删除二叉搜索树中的节点相关推荐

  1. 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...

  2. 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    文章目录 235. 二叉搜索树的最近公共祖先 思路 代码 困难 701.二叉搜索树中的插入操作 思路 代码 450.删除二叉搜索树中的节点 思路 代码 困难 今日收获 235. 二叉搜索树的最近公共祖 ...

  3. leetcode 450. 删除二叉搜索树中的节点 c语言实现

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

  4. 67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)

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

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

    参考 二叉搜索树删除操作 要删除节点有2子节点,找到右子树中最小的节点,将其val值覆盖要删除的节点值,再删除这个最小节点 要删除的节点的子节点为1个或0个,直接将要删除的节点的父节点指向子的子节点 ...

  6. 力扣450. 删除二叉搜索树中的节点(JavaScript)

    var deleteNode = function(root, key) {//没找到if(root==null){return root}//找到了if(root.val==key){//1,没有子 ...

  7. ​LeetCode刷题实战450:删除二叉搜索树中的节点

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  8. LeetCode450题—— 删除二叉搜索树中的节点

    首先需要认识什么是二叉搜索树,可以进入百度词条https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91/70 ...

  9. 【数据结构与算法】之深入解析“删除二叉搜索树中的节点”的求解思路与算法示例

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

最新文章

  1. 递归调用(Java)
  2. 局部响应归一化(Local Response Normalization)
  3. 使用go开启一个能够提供给html的a标签的下载的后端
  4. 4-5:TCP协议之连接管理机制(三次握手、四次挥手详解)
  5. 汉字在线转化unicode编码
  6. 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
  7. oracle 11g 存储结构和数据文件
  8. JVM----类的加载机制
  9. centos安装过程中gpt报错解决方案
  10. 图像匹配之归一化积相关灰度匹配
  11. 数学建模系列-优化模型---(一)规划模型
  12. jersey创建restful服务及调用_Jersey实现Restful服务(实例讲解)
  13. Android shape自定义形状,设置渐变色
  14. 计算机Word更改表格中,教你修改Word文本表格
  15. 欧美html游戏,欧美HTML社区服务游戏
  16. mysql cbrt函数_PostgreSQL学习笔记5之函数和操作符一
  17. html5 图片拱形旋转,CSS DIV拱形边框的图片
  18. pyinstaller打包icon报错
  19. 广东省 建筑标准规范 合集
  20. 服务器合租与虚拟主机的区别

热门文章

  1. java速算24,Java扑克牌速算24的方法
  2. python怎么用pip_python怎么使用pip工具
  3. matlab实现BCC异或,C#编程之C# BCC异或校验法
  4. 致:测试工程师们!超2000种连接件,下载96页完整选型目录!
  5. 微型数据中心正在向边缘发展
  6. 『数据中心』降低PUE值4种方法
  7. 万维网报务器与浏览器各有什么功能,浏览器是如何获得服务器上的信息的,第3章因特网的应用.ppt...
  8. AI:2021年WAIC世界人工智能大会2021年7月9日《可信AI论坛》、《AI引领探索保险科技新价值》、《产研共育·数智未来》等论坛演讲内容分享及解读
  9. upload-labs-master文件上传靶场第七关详解
  10. Flux快速入门指南