[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)如果当前结点有左右孩子,那么将左孩子的值放在右孩子的左子树的最左处,将当前结点修改为它的右孩子 返回给父节点更新

/**
 * 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 @ 2021-12-27 10:01  梦想是能睡八小时的猪  阅读(43)  评论(0)    收藏  举报