Skip to content

Delete from BST

Implementation

package main

import "fmt"

type Tree struct {
    data  int
    left  *Tree
    right *Tree
}

func main() {
    root := &Tree{
        data: 15,
        left: &Tree{
            data: 5,
            left: &Tree{
                data: 3,
            }},
        right: &Tree{
            data: 20,
            left: &Tree{
                data: 18,
                left: &Tree{
                    data: 16,
                },
            },
            right: &Tree{
                data: 80,
            },
        }}

    res := delete(root, 15)
    fmt.Printf("%+v", res)
}

func delete(root *Tree, val int) *Tree {
    if root == nil {
        return nil
    }
    if val < root.data {
        root.left = delete(root.left, val)

    } else if val > root.data {
        root.right = delete(root.right, val)
    } else {
        if root.left == nil {
            return root.right
        } else if root.right == nil {
            return root.left
        } else {
            succ := getSuccesor(root)
            root.data = succ.data
            delete(root.right, succ.data)
        }
    }
    return root
}

func getSuccesor(root *Tree) *Tree {
    curr := root.right
    for curr != nil && curr.left != nil {
        curr = curr.left
    }
    return curr
}