Family Day update
This commit is contained in:
parent
aac6731f2c
commit
9ad63ea473
2442 changed files with 39761 additions and 8255 deletions
|
|
@ -1,5 +1,4 @@
|
|||
from collections import namedtuple
|
||||
from sys import stdout
|
||||
|
||||
Node = namedtuple('Node', 'data, left, right')
|
||||
tree = Node(1,
|
||||
|
|
@ -15,41 +14,59 @@ tree = Node(1,
|
|||
None))
|
||||
|
||||
def printwithspace(i):
|
||||
stdout.write("%i " % i)
|
||||
print(i, end=' ')
|
||||
|
||||
def dfs(order, node, visitor):
|
||||
if node is not None:
|
||||
for action in order:
|
||||
if action == 'N':
|
||||
visitor(node.data)
|
||||
elif action == 'L':
|
||||
dfs(order, node.left, visitor)
|
||||
elif action == 'R':
|
||||
dfs(order, node.right, visitor)
|
||||
|
||||
def preorder(node, visitor = printwithspace):
|
||||
if node is not None:
|
||||
visitor(node.data)
|
||||
preorder(node.left, visitor)
|
||||
preorder(node.right, visitor)
|
||||
dfs('NLR', node, visitor)
|
||||
|
||||
def inorder(node, visitor = printwithspace):
|
||||
if node is not None:
|
||||
inorder(node.left, visitor)
|
||||
visitor(node.data)
|
||||
inorder(node.right, visitor)
|
||||
dfs('LNR', node, visitor)
|
||||
|
||||
def postorder(node, visitor = printwithspace):
|
||||
if node is not None:
|
||||
postorder(node.left, visitor)
|
||||
postorder(node.right, visitor)
|
||||
visitor(node.data)
|
||||
dfs('LRN', node, visitor)
|
||||
|
||||
def levelorder(node, more=None, visitor = printwithspace):
|
||||
if node is not None:
|
||||
def ls(node, more, visitor, order='TB'):
|
||||
"Level-based Top-to-Bottom or Bottom-to-Top tree search"
|
||||
if node:
|
||||
if more is None:
|
||||
more = []
|
||||
more += [node.left, node.right]
|
||||
visitor(node.data)
|
||||
if more:
|
||||
levelorder(more[0], more[1:], visitor)
|
||||
for action in order:
|
||||
if action == 'B' and more:
|
||||
ls(more[0], more[1:], visitor, order)
|
||||
elif action == 'T' and node:
|
||||
visitor(node.data)
|
||||
|
||||
stdout.write(' preorder: ')
|
||||
preorder(tree)
|
||||
stdout.write('\n inorder: ')
|
||||
inorder(tree)
|
||||
stdout.write('\n postorder: ')
|
||||
postorder(tree)
|
||||
stdout.write('\nlevelorder: ')
|
||||
levelorder(tree)
|
||||
stdout.write('\n')
|
||||
def levelorder(node, more=None, visitor = printwithspace):
|
||||
ls(node, more, visitor, 'TB')
|
||||
|
||||
# Because we can
|
||||
def reverse_preorder(node, visitor = printwithspace):
|
||||
dfs('RLN', node, visitor)
|
||||
|
||||
def bottom_up_order(node, more=None, visitor = printwithspace, order='BT'):
|
||||
ls(node, more, visitor, 'BT')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
w = 10
|
||||
for traversal in [preorder, inorder, postorder, levelorder,
|
||||
reverse_preorder, bottom_up_order]:
|
||||
if traversal == reverse_preorder:
|
||||
w = 20
|
||||
print('\nThe generalisation of function dfs allows:')
|
||||
if traversal == bottom_up_order:
|
||||
print('The generalisation of function ls allows:')
|
||||
print(f"{traversal.__name__:>{w}}:", end=' ')
|
||||
traversal(tree)
|
||||
print()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue