[Leetcode]43.删除二叉搜索树中的节点

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

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

    首先找到需要删除的节点;
    如果找到了,删除它。

 

示例 1:

 

 



输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。


示例 2:

 

 



输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

 

思想:递归遍历结点,返回调整好的结点。区分四种情况,包括

1.空节点 返回空

2.当前节点值比目标值大 将当前节点的左子树修改为递归调用的返回值

3.当前节点值比目标值小 将当前节点的右子树修改为递归调用的返回值

4.当前结点为目标值的结点

 1)如果当前结点没有左右孩子 直接返回空节点给父节点更新

 2)如果当前结点只有左孩子,将当前节点修改为它的左孩子 返回给父节点更新

 3)如果当前结点只有右孩子,将当前节点修改为它的右孩子 返回给父节点更新

 4)如果当前结点有左右孩子,那么将左孩子的值放在右孩子的左子树的最左处,将当前结点修改为它的右孩子 返回给父节点更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func deleteNode(root *TreeNode, key int) *TreeNode {
    if root == nil {
        return nil
    }
    if root.Val == key{
        if root.Right == nil && root.Left == nil {
            return nil
        }
        if root.Right != nil && root.Left == nil {
            root = root.Right
            return root
        }
        if root.Right == nil && root.Left != nil {
            root = root.Left
            return root
        }
        Left :=root.Left
        Right := root.Right
        temp := root.Right
        for temp.Left != nil {
            temp = temp.Left
        }
        temp.Left = Left
        root = Right
        return root
    }
    if root.Val > key {
        root.Left = deleteNode(root.Left, key)
    }
    if root.Val < key {
        root.Right = deleteNode(root.Right, key)
    }
    return root
}

 


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @   梦想是能睡八小时的猪  阅读(23)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示