golang力扣leetcode 450.删除二叉搜索树中的节点

简介: golang力扣leetcode 450.删除二叉搜索树中的节点

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

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

题解

如果key < root.Val,说明要删除的节点在BST的左子树,那么递归的去左子树删除即可

2 如果key > root.Val,说明要删除的节点在BST的右子树,那么递归的去右子树删除即可

3 如果key = root.Val,说明要删除的节点就是本节点,这一类又分以下三种情况:


要删除的节点是叶子节点,那很简单,直接将当前节点删除,置为nil即可;

要删除的节点有右子节点,那么为了维持BST的特性,我们需要找到该节点的后继节点post(BST中大于它的最小节点),将该节点的值更新为后继节点post的值,然后递归的在当前节点的右子树中删除该后继节点post;

要删除的节点有左子节点,那么为了维持BST的特性,我们需要找到该节点的前驱节点pre(BST中小于于它的最大节点),将该节点的值更新为前驱节点pre的值,然后递归的在当前节点的左子树中删除该前驱节点pre;

代码

type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func deleteNode(root *TreeNode, key int) *TreeNode {
  if root == nil {
    return root
  }
  if key < root.Val {
    root.Left = deleteNode(root.Left, key)
  } else if key > root.Val {
    root.Right = deleteNode(root.Right, key)
  } else {
    if root.Left == nil && root.Right == nil {
      root = nil
    } else if root.Right != nil {
      root.Val = successor(root).Val
      root.Right = deleteNode(root.Right, root.Val)
    } else if root.Left != nil {
      root.Val = predecessor(root).Val
      root.Left = deleteNode(root.Left, root.Val)
    }
  }
  return root
}
func predecessor(root *TreeNode) *TreeNode {
  pre := root.Left
  for pre.Right != nil {
    pre = pre.Right
  }
  return pre
}
func successor(root *TreeNode) *TreeNode {
  post := root.Right
  for post.Left != nil {
    post = post.Left
  }
  return post
}
目录
相关文章
|
2月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
2月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
14 1
|
2月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
20 1
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
43 0
|
2月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
13 0
|
2月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
21 0
|
2月前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
10 0
|
2月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
15 0
|
2月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
16 0
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
144 4
Golang语言之管道channel快速入门篇