diff options
Diffstat (limited to 'scratch/facebook/bst-checker.py')
-rw-r--r-- | scratch/facebook/bst-checker.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/scratch/facebook/bst-checker.py b/scratch/facebook/bst-checker.py new file mode 100644 index 000000000000..50edeeaa1997 --- /dev/null +++ b/scratch/facebook/bst-checker.py @@ -0,0 +1,79 @@ +from collections import deque + +class Node(object): + def __init__(self, value, left=None, right=None): + self.value = value + self.left = left + self.right = right + + def insert_left(self, value): + self.left = Node(value) + return self.left + + def insert_right(self, value): + self.right = Node(value) + return self.right + + def min(self): + xs = deque() + result = float('inf') + xs.append(self) + while xs: + node = xs.popleft() + result = min(result, node.value) + if node.left: + xs.append(node.left) + if node.right: + xs.append(node.right) + return result + + def max(self): + xs = deque() + result = float('-inf') + xs.append(self) + while xs: + node = xs.popleft() + result = max(result, node.value) + if node.left: + xs.append(node.left) + if node.right: + xs.append(node.right) + return result + + def is_bst(self): + result = True + if self.left: + result = result and self.left.max() < self.value + if self.right: + result = result and self.right.min() > self.value + return result + + +x = Node( + 50, + Node( + 17, + Node( + 12, + Node(9), + Node(14), + ), + Node( + 23, + Node(19), + ), + ), + Node( + 72, + Node( + 54, + None, + Node(67) + ), + Node(76), + ), +) + + +assert x.is_bst() +print("Success!") |