This is a fun-enough question, I guess. I feel like I’ve seen a few questions with BSTs where the answer involves the idea that in-order traversal presents their content as a sorted list. Or should… Oh yeah, this would much-improve my answer for this older question.
Interlude: Yield Statements
I guess sometimes they’re called coroutines? Fun excuse to use those in Python. For our purposes they’re a “better” (?) way of collapsing the BST we have into a sorted list. The magic of that isn’t the coroutines of course, it’s that in-order traversal of a BST presents the contents as a sorted list. The yield statement just makes it nice, we don’t have to allocate a whole intermediate list.
Solution
class Solution(object):
def inOrderYield(self, root):
if root is None:
return
for x in self.inOrderYield(root.left):
yield x
yield root.val
for y in self.inOrderYield(root.right):
yield y
def minDiffInBST(self, root):
minDiff = None
prev = None
for v in self.inOrderYield(root):
if prev is None:
prev = v
continue
if minDiff is None:
minDiff = v - prev
prev = v
continue
minDiff = min(minDiff, v - prev)
prev = v
return minDiff
I bet there’s a better way of doing the final loop in our main function.
More BST goodness here.