Hint 1
Consider implement these two helper functions:
getPredecessor(N), which returns the next smaller node to N.
getSuccessor(N), which returns the next larger node to N.
Hint 2
Try to assume that each node has a parent pointer, it makes the problem much easier.
Hint 3
Without parent pointer we just need to keep track of the path from the root to the current node using a stack.
Hint 4
You would need two stacks to track the path in finding predecessor and successor node separately.