80 lines
1.6 KiB
Python
80 lines
1.6 KiB
Python
|
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!")
|