Skip to main content

How to Build Tree Structures

🌲 Step 1: Decide the Tree Type

✅ Do you need a Binary Search Tree (BST)?

  • Structure where left child < parent < right child
  • Insertions follow value-based logic

✅ Do you need a Min/Max Heap?

  • Often implemented with arrays
  • Enforce ordering without necessarily being sorted

✅ Do you need a general N-ary tree?

  • Any number of children per node
  • Often used for hierarchical data like file systems or org charts

🔧 Step 2: Build Strategies

▶️ A. Recursive Build (for BST)

class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None

def insert_bst(root, val):
if not root:
return Node(val)
if val < root.val:
root.left = insert_bst(root.left, val)
else:
root.right = insert_bst(root.right, val)
return root

values = [4, 7, 3, 21, 15]
tree = None
for v in values:
tree = insert_bst(tree, v)

🗂️ B. Map-Based Build (when you have parent references)

data = [
{ "id": 1, "parent_id": None },
{ "id": 2, "parent_id": 1 },
{ "id": 3, "parent_id": 1 },
{ "id": 4, "parent_id": 2 }
]

tree_map = {item["id"]: {**item, "children": []} for item in data}
root = None

for item in data:
pid = item["parent_id"]
if pid is None:
root = tree_map[item["id"]]
else:
tree_map[pid]["children"].append(tree_map[item["id"]])

⬇️ C. Sorting + Heap Build (for binary heaps)

import heapq

values = [4, 7, 3, 21, 15]
heapq.heapify(values)

# Result is still array-based, but heap-ordered
print(values) # Min-heap by default

🧠 Build Direction: Top-Down vs Bottom-Up

DirectionDescriptionCommon Use CasesConstraint
Top-DownStart from root, add childrenFile systems, org chartsParents must be encountered before children
Bottom-UpStart from leaves, combine upwardMerkle trees, expression treesEach child must know its parent

Larger article on tree building direction here