In [1]:
class BinaryTreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def insert_left(self, value):
self.left = BinaryTreeNode(value)
return self.left
def insert_right(self, value):
self.right = BinaryTreeNode(value)
return self.right
In [29]:
def check_bst(tree, minv = None, maxv = None):
if tree is None:
return True
# initialize minmax
if minv is None or maxv is None:
minv, maxv = float('-inf'), float('inf')
print 'node %s, minv %s, maxv %s' % (tree.value, minv, maxv)
if node_is_valid(tree, minv, maxv):
return check_bst(tree.left, minv, tree.value) and check_bst(tree.right, tree.value, maxv)
else:
return False
def node_is_valid(tree, minv, maxv):
right_valid = tree.right is None or (maxv >= tree.right.value >= tree.value)
left_valid = tree.left is None or (minv <= tree.left.value <= tree.value)
print 'right? %s, left? %s, node %s, min %s, max %s' % (right_valid, left_valid, tree.value, minv, maxv)
return right_valid and left_valid
In [30]:
tree = BinaryTreeNode(100)
check_bst(tree)
Out[30]:
In [31]:
tree.left = BinaryTreeNode(80)
check_bst(tree)
Out[31]:
In [32]:
tree.right = BinaryTreeNode(105)
check_bst(tree)
Out[32]:
In [34]:
tree.right.left = BinaryTreeNode(101)
tree.right.right = BinaryTreeNode(190)
tree.left.left = BinaryTreeNode(70)
check_bst(tree)
Out[34]:
In [35]:
tree.left.right = BinaryTreeNode(120)
check_bst(tree)
Out[35]:
In [36]:
tree.left.right = None
tree.right.left = BinaryTreeNode(99)
check_bst(tree)
Out[36]:
In [ ]: