Traversal

BSP traversal order enumeration.

Overview

Traversal is an IntEnum that specifies the order in which nodes are visited when iterating through a BSP tree. Different traversal orders are useful for different algorithms and use cases.

Quick Reference

# Iterate BSP nodes in different orders
for node in bsp.traverse(mcrfpy.Traversal.PRE_ORDER):
    print(node.pos)

# Level order (default) - breadth-first
for node in bsp.traverse(mcrfpy.Traversal.LEVEL_ORDER):
    pass

# String shortcuts also work
for node in bsp.traverse('post'):
    pass

Values

Value Int Description
PRE_ORDER 0 Visit node before children (root first)
IN_ORDER 1 Visit left child, then node, then right child
POST_ORDER 2 Visit children before node (leaves first)
LEVEL_ORDER 3 Visit by depth level, top to bottom (breadth-first)
INVERTED_LEVEL_ORDER 4 Visit by depth level, bottom to top

String Shortcuts

The traverse() method also accepts string shortcuts:

String Equivalent
'pre' or 'PRE_ORDER' Traversal.PRE_ORDER
'in' or 'IN_ORDER' Traversal.IN_ORDER
'post' or 'POST_ORDER' Traversal.POST_ORDER
'level' or 'LEVEL_ORDER' Traversal.LEVEL_ORDER
'level_inverted' or 'INVERTED_LEVEL_ORDER' Traversal.INVERTED_LEVEL_ORDER

Use Cases

PRE_ORDER

Process parent before children. Useful for:

  • Copying tree structure
  • Serializing the tree
  • Top-down algorithms

IN_ORDER

Standard binary tree ordering. For BSP trees:

  • Visits nodes in spatial order along the split axis
  • Less commonly used for dungeon generation

POST_ORDER

Process children before parent. Useful for:

  • Bottom-up calculations (e.g., computing room sizes)
  • Deleting nodes safely
  • Combining child results

LEVEL_ORDER (Default)

Breadth-first traversal. Useful for:

  • Processing all rooms at each depth level
  • Finding the shallowest node meeting criteria
  • Default iteration order for BSP

INVERTED_LEVEL_ORDER

Deepest nodes first. Useful for:

  • Starting from leaf nodes
  • Building corridors from small rooms to large areas

Example: Finding All Leaf Nodes

# Using traverse with POST_ORDER ensures we see leaves before parents
leaves = []
for node in bsp.traverse(mcrfpy.Traversal.POST_ORDER):
    if node.is_leaf:
        leaves.append(node)

# Or simply iterate the BSP directly (uses LEVEL_ORDER for leaves)
leaves = list(bsp)

Example: Building Corridors Bottom-Up

# Process rooms from smallest (deepest) to largest
for node in bsp.traverse(mcrfpy.Traversal.INVERTED_LEVEL_ORDER):
    if not node.is_leaf:
        # Connect the two child regions
        left_center = node.left.center()
        right_center = node.right.center()
        # Draw corridor between centers...