class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
r = Node(10)
r.left = Node(5)
r.right = Node(15)
r.right.left = Node(12)
r.right.right = Node(20)
r.val
r.right.left.val
r = Node(10,
left=Node(5),
right=Node(15,
left=Node(12),
right=Node(20)))
def min(t):
if t and t.left:
return min(t.left)
elif t:
return t.val
min(r)
def max(t):
if t and t.right:
return max(t.right)
elif t:
return t.val
max(r)
def find(t, x):
if not t:
return False
elif x < t.val:
return find(t.left, x)
elif x > t.val:
return find(t.right, x)
else: # x == t.val
return True
find(r, 10)
find(r, 5)
find(r, 14)
find(r, 100)
find(r, -10)
def traverse(t, fn):
if t:
traverse(t.left, fn)
fn(t.val)
traverse(t.right, fn)
traverse(r, print)
# manually constructing an "expression tree" for 5 * (12 + 20)
r = Node('*',
left=Node(5),
right=Node('+',
left=Node(12),
right=Node(20)))
traverse(r, print)
def postorder_traverse(t, fn):
if t:
postorder_traverse(t.left, fn)
postorder_traverse(t.right, fn)
fn(t.val)
postorder_traverse(r, print) # postfix output!