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

给定一个二叉搜索树的根节点 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;}
}

 

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

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

相关文章

未来智能:人有人用,机有机用

来源&#xff1a; 苇草智酷作者&#xff1a;王飞跃当今最好的人工智能程序到底有多智能&#xff1f;它们是如何工作的&#xff1f;能做些什么&#xff1f;我们有必要担心机器比人类聪明且将很快夺取我们的工作吗&#xff1f;以上这些问题都颇受人们的关注&#xff0c;梅拉妮米歇…

Leetcode--329. 矩阵中的最长递增路径

给定一个整数矩阵&#xff0c;找出最长递增路径的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你不能在对角线方向上移动或移动到边界外&#xff08;即不允许环绕&#xff09;。 示例 1: 输入: nums [ [9,9,…

排序及查找----[(冒泡,快速)(拉格朗日,二分)]

代码展示: 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace paixu8 {9 class Program10 {11 static void Main()12 {13 int[] Array { 1, 45…

因果作用推断、因果网络学习及其他

来源&#xff1a;久章智能 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱…

学习《图解HTTP》有感

HTTP协议的出现主要是为了解决文本传输的难题&#xff08;大家互相共享文件没有一个规范&#xff09;&#xff0c;最初的设计理念是&#xff1a;借助多文档之间的关联形成超文本&#xff0c;成为相互参阅的WWW&#xff08;万维网&#xff09; 计算机和网络设备要通信&#xff…

mysql解决select * from 表名 (where + 约束条件为空)

mysql解决select * from 表名 (where 约束条件为空)&#xff0c;示例如下&#xff1a; SELECT * from tableName WHERE name is NULL; 从 tableName 表中查询 name 字段为空的记录。转载于:https://www.cnblogs.com/zrmw/p/9887655.html

通信人工智能的下一个十年(上)

来源&#xff1a;电信科学欧阳晔1, 王立磊1, 杨爱东1, 马利克萨哈2, 大卫贝兰格3,4, 高同庆5, 韦乐平6, 张亚勤71 亚信科技&#xff08;中国&#xff09;有限公司&#xff0c;北京 1001932 美国威瑞森电信公司&#xff0c;美国 纽约 100363 美国电话电报公司&#xff0c;美国 得…

[Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

CAS

cas&#xff1a;Compare and Swap&#xff0c;即比较再交换。 对CAS的理解&#xff0c;CAS是一种无锁算法&#xff0c;CAS有3个操作数&#xff0c;内存值V&#xff0c;旧的预期值A&#xff0c;要修改的新值B。当且仅当预期值A和内存值V相同时&#xff0c;将内存值V修改为B&…

大脑使用交叉存储,来区分现在和过去

来源&#xff1a;混沌巡洋舰在每一个清醒的时刻&#xff0c;人类和其他动物必须在我们对过去的记忆和对现在的意识两者中保持平衡。我们必须吸收关于周围世界的新的感官信息&#xff0c;同时保持对早期观察或事件的短期记忆。我们理解周围环境、学习、行动和思考的能力都依赖于…

CONTINUE...? ZOJ - 4033

CONTINUE...? ZOJ - 4033 题解&#xff1a;先计算一下总数sum是否是偶数&#xff0c;如果不是则不能分出来&#xff0c;如果是则从后面开始分&#xff0c;先把人分到1、3组&#xff0c;分完sum / 2这些人&#xff0c;如果恰好能够分成零&#xff0c;那么剩下前面的都分到2、4组…

对象在内存中的存储布局

对象头包含&#xff1a; markword(和锁相关的信息) 8字节 class pointer(说明对象属于哪个类)&#xff0c;jvm指针八字节&#xff0c;但是默认压缩&#xff0c;所有4个字节 对象体包含&#xff1a; instance word实例数据(例如int&#xff0c;这就占四个字节&#xff0c;l…

用研究新范式破解生命科学难题

来源&#xff1a;中国科学报 作者&#xff1a;丛斌&#xff08;中国工程院士&#xff09;采访整理&#xff1a;张思玮&#xff08;本报记者&#xff09;当今&#xff0c;世界科技正处于重大变革前夕。各领域科学家们一直积极地探索物质本质、宇宙本源、生命本质&#xff0c;并迫…

synchronized与volatile

synchronized实现过程&#xff1a; 1.Java代码&#xff1a;synchronized 2.字节码层级&#xff1a;monitorenter&#xff0c;monitorexit 3.执行过程中自动升级&#xff08;偏向->自旋->重量级锁&#xff09; 4.cpu汇编层级:lock comxchg 上图为双核cpu的内部构造&am…

redis 字符串数据(string)

Redis 字符串数据类型的相关命令用于管理 redis 字符串值&#xff0c;基本语法如下&#xff1a; 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> GET runoobkey "redis" 在以上实例…

AI 技术与人类主体想象 ——基于人工直觉在线讨论的研究

来源&#xff1a; 人工智能哲学探索作者&#xff1a;雅克布约翰森&#xff08;英国圣玛丽大学&#xff09; 王鑫&#xff08;辽宁大学&#xff09;一、引言:AI、神经形态硬件、人工直觉AI 在媒体上的讨论越来越多,很多广为流行的专业网站上的相关探讨涵盖了 AI 发展的最新趋势和…

Java四种引用

强引用&#xff1a;没有使用时调用System.gc()会回收 eg&#xff1a;M m new M(); mnull;System.gc(); 软引用&#xff1a;内存不够时就回收 作用&#xff1a;一般使用在缓存时&#xff0c;比如把一些图片存储&#xff0c;内存不够时就自动回收 弱引用&#xff1a; 垃圾回…

js 控制页面跳转的5种方法

js 控制页面跳转的5种方法 编程式导航&#xff1a; 点击跳转路由&#xff0c;称编程式导航&#xff0c;用js编写代码跳转。 History是bom中的History.back是回退一页Histiory.go(1)前进一页History.go(-1)后退一页HandleClick(){Console.log(this.props.history);}This.props.h…

永动机与热力学定律

来源&#xff1a;力学酒吧 撰文&#xff1a;张伟伟热力学三大定律分别为能量守恒、熵增定律和绝对零度无法到达&#xff0c;人们对热力学定律的认识也是纠正永动机思想的过程&#xff0c;是人类“美好思想”不断“碰壁”的过程&#xff0c;这些“碰壁”对于个人成长有着深刻的启…

浅析ThreadLocal

线程本地变量 每个线程独立拥有&#xff0c;线程存在&#xff0c;ThreadLocal就一直存在。 使用场景&#xff1a;spring 事务 里面有m方法&#xff0c;m调用了m1&#xff0c;m2&#xff0c;比如m1&#xff0c;m2都去访问数据库 如果分别建立两个数据库连接&#xff0c;事务…