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

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

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

示例:

root = [5,3,6,2,4,null,7]
key = 3

5
   / \
  3   6
 / \     \
2   4   7

给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

5
   / \
  4   6
 /       \
2       7

另一个正确答案是 [5,2,6,null,4,null,7]。

5
   /  \
  2   6
   \    \
    4   7

思路:递归

二叉搜索树特性:root.left<root<root.right

依据这个特性找到要删除的元素时间复杂度就是o(logn)也就是o(h)

接下来判断删除的结点属性:

1.叶子节点,直接置空

2.非叶子节点,那么要么左子树最大的顶替他的位置,要么右子树最小的顶替他的位置

之后左/右子树也按照这个方法进行调整。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int front(TreeNode root){root = root.left;while(root.right!=null){root=root.right;}return root.val;}public int next(TreeNode root){root = root.right;while(root.left!=null){root = root.left;}return root.val;}public TreeNode deleteNode(TreeNode root, int key) {if(root==null) {return null;}if(root.val>key){root.left = deleteNode(root.left,key);}else if(root.val<key){root.right = deleteNode(root.right,key);}else{if(root.left==null&&root.right==null){root=null;}else if(root.left!=null){root.val = front(root);root.left = deleteNode(root.left,root.val);}else{root.val = next(root);root.right = deleteNode(root.right,root.val);}}return root;}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 【收藏】HBase集成Phoenix实现类SQL操作hbase
  2. android错误-android.util.AndroidRuntimeException:You cannot combine custom titles with other title
  3. python k线顶分型_【缠论】分型、笔的定义及其程序化
  4. C#连接4种类型数据库(Access、SQL Server、Oracle、MySQL)
  5. mysql临时表数量_MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
  6. 在超链接href中实现form的提交
  7. webview 模拟点击_Android如何基于坐标对View进行模拟点击事件详解
  8. EMI (电磁干扰)
  9. Linux下informix的安装(最简单超详细)
  10. web前端教程,详解引入CSS的4种方式
  11. yuv420转yuv422(yuyv)
  12. oracle 授权所有语句,oracle grant 授权语句
  13. 以太坊实战之《如何正确处理nonce》
  14. Android View绘制6 Draw过程(下)
  15. 原型模型| 软件工程
  16. “我只警告一次,下次我会直接忽略你发的垃圾,懂?”Linus 精彩炮轰语录集锦...
  17. colab如何读取google drive(谷歌云盘)的文件
  18. 坑,爱转换PDF转换器,熊猫办公
  19. 怎么安装Python?改选什么版本呢?Python新手必看
  20. 2018中国区块链百强企业第一弹 | 链塔智库

热门文章

  1. 剑指Offer - 面试题5. 替换空格(字符串)
  2. LeetCode 462. 最少移动次数使数组元素相等 II(数学)
  3. python安装scipy出现红字_windows下安装numpy,scipy遇到的问题总结
  4. java toast_Android中Toast的用法简介
  5. Java基础10(反射)
  6. 人在斯坦福,刚上CS224n
  7. NLP预训练之路——从word2vec, ELMo到BERT
  8. 论文浅尝 | 时序与因果关系联合推理
  9. 漆桂林 | 人工智能的浪潮中,知识图谱何去何从?
  10. 论文浅尝 | Global Relation Embedding for Relation Extraction