package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderPredecessor(root *TreeNode, p *TreeNode) *TreeNode {
if p.Left != nil {
// Move to left subtree
curr := p.Left
// Find rightmost node in left subtree
for curr.Right != nil {
curr = curr.Right
}
return curr
}
// If no left subtree, find deepest ancestor where p is in right subtree
var predecessor *TreeNode
curr := root
for curr != nil {
if p.Val > curr.Val {
predecessor = curr
curr = curr.Right
} else if p.Val < curr.Val {
curr = curr.Left
} else {
break
}
}
return predecessor
}
func main() {
// Build BST
root := &TreeNode{5, nil, nil}
root.Left = &TreeNode{3, &TreeNode{2, nil, nil}, &TreeNode{4, nil, nil}}
root.Right = &TreeNode{7, nil, &TreeNode{8, nil, nil}}
p := root // node with value 5
pred := inorderPredecessor(root, p)
if pred != nil {
fmt.Printf("Inorder predecessor of %d is %d\n", p.Val, pred.Val)
} else {
fmt.Printf("Inorder predecessor of %d does not exist\n", p.Val)
}
}Check if node has left subtree to find predecessor there
for curr.Right != nil { curr = curr.Right }
Find rightmost node in left subtree
Return found predecessor in left subtree
var predecessor *TreeNode
curr := root
for curr != nil {
If no left subtree, search ancestors for predecessor
if p.Val > curr.Val { predecessor = curr; curr = curr.Right }
Move right and update predecessor when p is greater
else if p.Val < curr.Val { curr = curr.Left }
Move left when p is smaller
Stop when node p is found
Return found predecessor or nil if none
Inorder predecessor of 5 is 4