66 lines
1.4 KiB
Python
66 lines
1.4 KiB
Python
|
from random import choice
|
||
|
|
||
|
|
||
|
class Node(object):
|
||
|
def __init__(self, value=None, left=None, right=None):
|
||
|
self.value = value
|
||
|
self.left = left
|
||
|
self.right = left
|
||
|
|
||
|
|
||
|
def p(node, indent=0):
|
||
|
print(indent * ' ' + '|-' + str(node.value))
|
||
|
if node.left is not None:
|
||
|
p(node.left, indent=indent + 2)
|
||
|
if node.right is not None:
|
||
|
p(node.right, indent=indent + 2)
|
||
|
|
||
|
|
||
|
# read trees (i.e. traversing, parsing)
|
||
|
# write trees (i.e. generating, printing)
|
||
|
def random(d=0):
|
||
|
left = None
|
||
|
right = None
|
||
|
|
||
|
if choice([True, False]):
|
||
|
left = random(d + 1)
|
||
|
|
||
|
if choice([True, False]):
|
||
|
right = random(d + 1)
|
||
|
|
||
|
return Node(
|
||
|
value=d,
|
||
|
left=left,
|
||
|
right=right,
|
||
|
)
|
||
|
|
||
|
|
||
|
################################################################################
|
||
|
# DFTs can be:
|
||
|
# - imperative (mutable)
|
||
|
# - functional (immutable)
|
||
|
# - iterative
|
||
|
# - recursive
|
||
|
################################################################################
|
||
|
|
||
|
|
||
|
# Iterative
|
||
|
def traverse(node, f):
|
||
|
stack = [(node, 0)]
|
||
|
|
||
|
while len(stack):
|
||
|
node, depth = stack.pop()
|
||
|
f(node, depth)
|
||
|
print(depth)
|
||
|
|
||
|
if node.left is not None:
|
||
|
stack.append((node.left, depth + 1))
|
||
|
if node.right is not None:
|
||
|
stack.append((node.right, depth + 1))
|
||
|
|
||
|
|
||
|
print('----------------------------------------------------------------------')
|
||
|
for _ in range(10):
|
||
|
traverse(random(), lambda _, d: print(d))
|
||
|
print()
|