删除BST的节点

1.题目描述:

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

2.思路

1.找到需要删除的节点,找到,删除 时间复杂度**O(h)**h为树高
2.调整BST

递归法的涉及单层逻辑

  • 确定单层逻辑(主要有五种情况)
    找到删除节点,直接返回

    • 找到删除节点

      • 2.左右孩子为空(叶子节点),直接删除,返回null为根节点
      • 3.删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
      • 4.删除右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
      • 5.左右孩子都不为空,将删除节点左子树头节点,放到删除节点的右子树最左面节点的左孩子上,返回删除节点右孩子为新的根节点

3.代码(递归思路)

严格遵守递归三部曲!!!

package 二叉树;public class 删除BST的节点 {/*** 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。* 思路:* 1.找到需要删除的节点,找到,删除   时间复杂度O(h)h为树高* 2.调整BST*///1.递归法//确定递归函数参数和返回值public TreeNode delNode(TreeNode root,int key){//第一种:没有找到删除节点,直接返回//确定终止条件为空返回if(root==null) return root;/*** 确定单层逻辑(主要有五种情况)* 1.未找到删除节点,直接返回* 找到删除节点*      2.左右孩子为空(叶子节点),直接删除,返回null为根节点*      3.删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点*      4.删除右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点*      5.左右孩子都不为空,将删除节点左子树头节点,放到删除节点的右子树最左面节点的左孩子上,返回删除节点右孩子为新的根节点*///2if(root.val==key){if(root.left==null&&root.right==null){return null;}//3else if(root.left==null){TreeNode retNode=root.right;return retNode;}//4else if(root.right==null){TreeNode retNode=root.left;return retNode;}//5else{//找右子树最左面节点TreeNode cur=root.right;while(cur.left!=null){cur=cur.left;}cur.left=root.left;TreeNode tmp=root;root=root.right;return root;}}if(root.val>key) root.left=delNode(root.left,key);if(root.val<key) root.right=delNode(root.right,key);return root;}}

完结

删除`BST`的节点相关推荐

  1. 【Java数据结构】BST树(二叉搜索树)总结03(求BST树高度,求BST树节点个数)

    二叉树总结:入口 二叉树的基本操作: 1.插入,删除 操作 2.前.中.后序遍历,层序遍历 3.求BST树高度,求BST树节点个数 4.返回中序遍历第k个节点的值 5.判断一个二叉树是否是BST树,判 ...

  2. 剑指offer:面试题18. 删除链表的节点

    题目:删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], ...

  3. 016_Redis集群的删除和添加节点

    1. 集群操作命令 1.1. 查看集群命令 1.2. create创建一个集群. 1.3. add-node添加一个节点到集群. 1.4. reshard分片. 1.5. del-node移除一个节点 ...

  4. LeetCode-剑指 Offer 18. 删除链表的节点

    剑指 Offer 18. 删除链表的节点 思路:用一个头节点,以及pre,cur双指针 /*** Definition for singly-linked list.* struct ListNode ...

  5. 双向链表删除节点时间复杂度_删除链表的节点(剑指offer第十七题)

    删除链表的节点 题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点.返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], ...

  6. 删除链表重复节点 python_java删除链表中重复的节点(保留一个节点)

    两种方法实现: package cn.exercise.list; import java.util.HashMap; /** * 删除链表重复节点(重复节点只保留一个) */ public clas ...

  7. 【0ms优化】剑指 Offer 18. 删除链表的节点

    立志用最少的代码做最高效的表达 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5, ...

  8. 链表之删除链表中间节点

    题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二,  得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除   方法 ...

  9. 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )

    在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( ) A.q=p->next; p->next=p->next->next; free(q) B.p=p-> ...

最新文章

  1. php引用计数的基本知识
  2. nginx常用功能全揭秘(内附福利!!!)
  3. 在mysql中什么情况下不能指定字符集_如何为Mysql选择合适的字符集?
  4. 神策数据杨宁:财富管理转型趋势下的精细化运营
  5. 三国志战略版服务器维护延时,三国志战略版服务器爆满是多少人 爆满进不去怎么办...
  6. android 自动表单提交数据,Android 使用三种方式获取网页(通过Post,Get进行表单的提交)...
  7. TypeScript输入参数的默认值一例,以及对应生成的JavaScript代码分析
  8. LINUX framebuffer
  9. git 可视化工具_Git的基本使用(二)
  10. plsql大字段保存类型_大揭秘,学习python,为什么数据类型有这么重要
  11. Angular JS(二) 指令部分
  12. Python之代码性能分析工具(时间+内存)
  13. 中级维修电工实训装置
  14. 解决tensorflow下载速度慢
  15. 毕业季:我和未来有个对话
  16. html5 窗口 最小化,HTML5 窗口最小化动画(先压扁后变窄)
  17. grafana repeat 特性
  18. 什么是空指针?如何从根源避免空指针
  19. Cmake管理统一版本的SLAM第三方库
  20. sweet home3d_Sweet Home 3D:一个开源工具,可帮助您决定梦想中的家

热门文章

  1. 工具武装的前端开发工程师 1
  2. 【哈工大2022计算机系统大作业“程序人生”】
  3. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...
  4. 计算机专业英语词汇缩写大全(J-Z)
  5. 矩阵的加减乘c语言程序,C语言实现的矩阵加减乘法运算系统
  6. echarts x轴显示time
  7. 2020-09-07
  8. 基于TIA博途利用SCL语言开发沿指令FC全局库来减少工作存储区的使用
  9. 集装箱式水处理设备解决方案
  10. poj 2234 博弈-Nim