一、题目描述:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;如果找到了,删除它。说明:要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7] key = 3
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。 一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。
解题思路:首先,这个题目可以根据删除的节点的左右节点来判断。
而找到该节点是非常简单的,因为这棵树是二叉搜索树,而二叉搜索树的特性,左节点的值一定小于该节点值,右节点的值一定大于该节点的值,所以直接搜索就可以找到该值。
所以重点在于怎么判断该节点的左右节点的情况。
大致可以分为四种:
1.该节点没有左节点,也没有右节点2.该节点没有左节点,但有右节点3.该节点有左节点,但没有右节点4.该节点有左节点,也有右节点
第一种:对于第一种情况,直接将该节点删除即可。第二种:对于第二种情况,直接删除节点,将左节点代替该节点。第三种:对于第三种情况:直接删除节点,将右节点代替该节点。第四种:对于第四种情况,又可以分为三种情况:
1.该节点的左节点没有右节点,将左节点代替该节点。2.该节点的右节点没有左节点,将右节点代替该节点。3.对于都有的情况,为了保证二叉搜索树的结构,我们 ① :可以用该节点的左节点最右节点的值代替该节点;②:也可以用该节点的右节点的最左节点的值代替该节点。
而对于最后的情况,也就是第四种情况的第三种情况, 需要注意 ①中,如果最右节点还有左节点,我们可以用最右节点的左节点的值代替最右节点所在的位置; ②中,如果最左节点还有右节点,我们可以用最左节点的右节点的值代替最左节点所在的位置。
再一次总结归纳:
其实,最后第四种情况的第三种就包括了前面所有的方面,
在找到该节点后:
1.如果该节点的左节点不为空,我们用该节点的左节点最右节点的值代替该节点;2.否则,如果该节点的右节点不为空,我们可以用该节点的右节点的最左节点的值代替该节点。3.否则,将该节点置空。
找到该节点,非常容易,因为左节点的值一定小于该节点值,右节点的值一定大于该节点的值。
所以,从根节点开始遍历
1.如果遍历到的节点的值大于该值,该值一定处于该节点的右子树,往右遍历即可。2.否则,如果遍历到的节点的值小于该值,该值一定处于该节点的左子树,往左遍历即可。3.否则,就是找到了该值,在进行上述操作即可。
时间复杂度:O(h),其中 n 为树的高度。
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:39.2 MB, 在所有 Java 提交中击败了8.92%的用户
参考:1、题目[1] 2、官方解答[2]
本文首发于CSDN,作者:lomtom 原文链接:https://blog.csdn.net/qq_41929184/article/details/112662236 你的支持就是我最大的动力。
[1]
题目: https://leetcode-cn.com/problems/delete-node-in-a-bst/
[2]
官方解答: https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/shan-chu-er-cha-sou-suo-shu-zhong-de-jie-dian-by-l/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有