46 lines
750 B
Go
46 lines
750 B
Go
package q450
|
|
|
|
type TreeNode struct {
|
|
Val int
|
|
Left *TreeNode
|
|
Right *TreeNode
|
|
}
|
|
|
|
func del(node *TreeNode) *TreeNode {
|
|
if node == nil || node.Left == nil && node.Right == nil {
|
|
return nil // is leaf
|
|
}
|
|
if node.Left == nil {
|
|
return node.Right
|
|
}
|
|
if node.Right == nil {
|
|
return node.Left
|
|
}
|
|
|
|
p := node.Left
|
|
for p.Right != nil {
|
|
p = p.Right
|
|
}
|
|
p.Right = node.Right
|
|
return node.Left
|
|
}
|
|
|
|
func findAndDel(node **TreeNode, key int) {
|
|
if *node == nil {
|
|
return
|
|
}
|
|
if (**node).Val == key {
|
|
*node = del(*node)
|
|
} else if key < (**node).Val {
|
|
findAndDel(&(**node).Left, key)
|
|
} else {
|
|
findAndDel(&(**node).Right, key)
|
|
}
|
|
}
|
|
|
|
func deleteNode(root *TreeNode, key int) *TreeNode {
|
|
findAndDel(&root, key)
|
|
return root
|
|
}
|
|
|
|
var _ = deleteNode
|