package main
import (
"fmt"
)
type BSTNode struct {
key int
left *BSTNode
right *BSTNode
}
func insertBST(root *BSTNode, key int) *BSTNode {
if root == nil {
return &BSTNode{key: key}
}
if key < root.key {
root.left = insertBST(root.left, key) // go left to keep order
} else if key > root.key {
root.right = insertBST(root.right, key) // go right to keep order
}
return root
}
func findNextHigherBST(root *BSTNode, key int) *BSTNode {
var successor *BSTNode
curr := root
for curr != nil {
if key < curr.key {
successor = curr // potential next higher
curr = curr.left // go left to find smaller candidate
} else {
curr = curr.right // go right to find larger keys
}
}
return successor
}
// Simple Hash Map using Go map
func insertHashMap(m map[int]bool, key int) {
m[key] = true
}
func findNextHigherHashMap(m map[int]bool, key int) (int, bool) {
next := 0
found := false
for k := range m {
if k > key {
if !found || k < next {
next = k
found = true
}
}
}
return next, found
}
func main() {
keys := []int{5, 3, 7, 2, 9}
// Build BST
var root *BSTNode
for _, k := range keys {
root = insertBST(root, k)
}
// Build Hash Map
hashMap := make(map[int]bool)
for _, k := range keys {
insertHashMap(hashMap, k)
}
// Find next higher key after 5
bstSucc := findNextHigherBST(root, 5)
if bstSucc != nil {
fmt.Printf("BST next higher key after 5: %d\n", bstSucc.key)
} else {
fmt.Println("BST no next higher key after 5")
}
hashSucc, found := findNextHigherHashMap(hashMap, 5)
if found {
fmt.Printf("Hash Map next higher key after 5: %d\n", hashSucc)
} else {
fmt.Println("Hash Map no next higher key after 5")
}
}
if key < root.key {
root.left = insertBST(root.left, key) // go left to keep order
} else if key > root.key {
root.right = insertBST(root.right, key) // go right to keep order
}
insert key in BST maintaining order by going left or right
for curr != nil {
if key < curr.key {
successor = curr // potential next higher
curr = curr.left // go left to find smaller candidate
} else {
curr = curr.right // go right to find larger keys
}
}
find next higher key by traversing BST and tracking successor
for k := range m {
if k > key {
if !found || k < next {
next = k
found = true
}
}
}
scan all keys in Hash Map to find minimal key greater than given key
BST next higher key after 5: 7
Hash Map next higher key after 5: 7