Assuming that by "next largest," you mean, the next largest node from wherever the current node is...
From the current node, go right once. You've gone to a higher valued node. Then, go left as many times as possible. You've ended at the lowest valued node which is still higher than where you started.
(source: ray at cs.lmu.edu)
Example. Start at 60, go right once, go left as many times as you can. You end up at 62.
Try the same thing for 41. You will end up at 42.
EDIT:
This should help with your second case. Pseudocode:
If (current.hasNoRightChild)
testParent = current
nextLargest = maxValueInTree
While (testParent.hasParent)
testParent = current.Parent
If (testParent > current && testParent < nextLargest)
nextLargest = testParent
While (testParent.hasLeftChild)
testLeftChild = testParent.testLeftChild
If (testLeftChild > current && testLeftChild < nextLargest)
nextLargest = testLeftChild
End if
End while
End if
End while
End if
Can't guarantee no bugs in that, but the general idea is you check each parent, slowly working your way to the top of the tree. At each node, you stop and see if it is a candidate to be the "next largest" (i.e. it is greater than the node you started from and less than the current guess of next largest). At each of these stops, if the node is greater than where you started, you must explore all the way down the subtree of that node on the left branch only, checking each value along the way. I think that should do it, but you should probably test it heavily with random values to make sure there aren't any other cases we've overlooked.