Of course! Generating a "random tree" can mean a few different things in Python. I'll cover the three most common interpretations:

- A Randomly Generated Filesystem Tree (Great for testing and demos)
- A Randomly Generated Data Structure Tree (e.g., a Binary Tree)
- A Randomly Generated Graph Tree (using a network library like
networkx)
Let's go through each one with code examples.
Randomly Generated Filesystem Tree
This is a very common task for creating dummy directories and files for testing, backups, or demos. We'll use Python's built-in os and random modules.
The Goal
Create a directory structure that looks like this, but with random names and a random number of files/folders at each level.
project_root/
├── src/
│ ├── main.py
│ ├── utils/
│ │ ├── helpers.py
│ │ └── data.py
│ └── config/
│ └── settings.json
├── tests/
│ └── test_main.py
└── docs/
└── README.md
The Code
import os
import random
import string
# --- Configuration ---
ROOT_DIR = "random_project_structure"
MAX_DEPTH = 4
MAX_FILES_PER_DIR = 5
MAX_DIRS_PER_DIR = 3
FILE_EXTENSIONS = ['.py', '.txt', '.json', '.md', '.csv']
DIR_PREFIX = "folder_"
FILE_PREFIX = "file_"
def generate_random_name(prefix: str, use_ext: bool = False) -> str:
"""Generates a random name with a prefix and an optional extension."""
length = random.randint(5, 10)
random_str = ''.join(random.choices(string.ascii_lowercase + string.digits, k=length))
if use_ext:
ext = random.choice(FILE_EXTENSIONS)
return f"{prefix}{random_str}{ext}"
return f"{prefix}{random_str}"
def create_random_tree(current_path: str, current_depth: int):
"""
Recursively creates a random tree of directories and files.
"""
if current_depth >= MAX_DEPTH:
return
# Decide how many subdirectories and files to create in the current path
num_dirs = random.randint(0, MAX_DIRS_PER_DIR)
num_files = random.randint(0, MAX_FILES_PER_DIR)
# Create subdirectories
for _ in range(num_dirs):
dir_name = generate_random_name(DIR_PREFIX)
dir_path = os.path.join(current_path, dir_name)
os.makedirs(dir_path, exist_ok=True)
print(f" " * current_depth + f"[DIR] {dir_path}")
# Recurse into the new subdirectory
create_random_tree(dir_path, current_depth + 1)
# Create files
for _ in range(num_files):
file_name = generate_random_name(FILE_PREFIX, use_ext=True)
file_path = os.path.join(current_path, file_name)
# Create an empty file
with open(file_path, 'w') as f:
f.write(f"This is a dummy file: {file_name}\n")
print(f" " * current_depth + f"[FILE] {file_path}")
# --- Main Execution ---
if __name__ == "__main__":
# Clean up previous runs
if os.path.exists(ROOT_DIR):
print(f"Removing existing directory: {ROOT_DIR}")
# For a simple script, shutil.rmtree is better
import shutil
shutil.rmtree(ROOT_DIR)
print(f"Creating random tree in: {ROOT_DIR}")
os.makedirs(ROOT_DIR, exist_ok=True)
print(f"[DIR] {ROOT_DIR}")
create_random_tree(ROOT_DIR, 1)
print("\nRandom tree generation complete!")
How to Run It
- Save the code as a Python file (e.g.,
make_tree.py). - Run it from your terminal:
python make_tree.py. - A new directory named
random_project_structurewill be created with a random structure inside.
Randomly Generated Data Structure Tree (e.g., Binary Tree)
This involves creating a tree in memory, often for algorithm practice or simulations. We'll define a Node class and then build a tree by randomly adding children.

The Goal
Create a simple N-ary tree (a tree where a node can have any number of children) with random values and a random structure.
The Code
import random
class Node:
"""A simple node for a tree structure."""
def __init__(self, value):
self.value = value
self.children = []
def add_child(self, child_node):
self.children.append(child_node)
def __repr__(self, level=0):
"""Helper to print the tree structure."""
ret = "\t" * level + repr(self.value) + "\n"
for child in self.children:
ret += child.__repr__(level + 1)
return ret
def generate_random_tree_node(depth: int, max_depth: int, max_children: int) -> Node | None:
"""
Recursively builds a random tree node and its children.
Returns None to stop a branch from growing.
"""
if depth > max_depth:
return None
# Create the current node with a random value
value = random.randint(1, 99)
node = Node(value)
# Randomly decide how many children this node will have
num_children = random.randint(0, max_children)
for _ in range(num_children):
child_node = generate_random_tree_node(depth + 1, max_depth, max_children)
if child_node:
node.add_child(child_node)
return node
# --- Main Execution ---
if __name__ == "__main__":
MAX_TREE_DEPTH = 4
MAX_CHILDREN_PER_NODE = 3
print("Generating a random binary-like tree...")
root = generate_random_tree_node(depth=0, max_depth=MAX_TREE_DEPTH, max_children=MAX_CHILDREN_PER_NODE)
if root:
print("\n--- Generated Tree Structure ---")
print(root)
else:
print("Could not generate a tree (root is None).")
How to Run It
- Save the code as a Python file (e.g.,
data_tree.py). - Run it:
python data_tree.py. - You'll see a text-based representation of the randomly generated tree printed to your console. Each run will produce a different tree.
Randomly Generated Graph Tree (using networkx)
For more complex graph theory tasks, the networkx library is the standard in Python. A "tree" in graph theory is a connected, acyclic graph. We can generate one randomly.
The Goal
Use networkx to create a random tree and visualize it.
Prerequisites
You need to install networkx and a plotting library like matplotlib.

pip install networkx matplotlib
The Code
networkx has a built-in function to generate a random tree, which is very efficient.
import networkx as nx
import matplotlib.pyplot as plt
def generate_and_plot_random_tree(num_nodes: int):
"""
Generates a random tree using networkx and plots it.
"""
if num_nodes < 1:
print("Number of nodes must be at least 1.")
return
# Method 1: Using a built-in function (easiest and most common)
# This generates a uniformly random tree.
G = nx.random_tree(n=num_nodes, create_using=nx.Graph)
# Add some random weights to edges to make it more interesting
for u, v in G.edges():
G.edges[u, v]['weight'] = random.randint(1, 10)
# --- Plotting the tree ---
plt.figure(figsize=(10, 8))
# Use a spring layout for a nice visual arrangement
# The 'pos' argument gives node positions for the plot
pos = nx.spring_layout(G, seed=42) # seed for reproducibility
# Draw nodes
nx.draw_networkx_nodes(G, pos, node_size=700, node_color='skyblue')
# Draw edges with varying thickness based on weight
edge_weights = [G.edges[u, v]['weight'] for u, v in G.edges()]
nx.draw_networkx_edges(G, pos, width=edge_weights, alpha=0.6)
# Draw labels
nx.draw_networkx_labels(G, pos, font_size=12, font_family='sans-serif')
# Draw edge weight labels
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.title(f"Random Tree with {num_nodes} Nodes")
plt.axis('off') # Hide the axes
plt.show()
# --- Main Execution ---
if __name__ == "__main__":
num_nodes_to_generate = 15
generate_and_plot_random_tree(num_nodes_to_generate)
How to Run It
- Make sure you have installed the libraries:
pip install networkx matplotlib. - Save the code as a Python file (e.g.,
graph_tree.py). - Run it:
python graph_tree.py. - A window will pop up showing a plot of your randomly generated tree. The edge thickness represents the random weight assigned to it.
Summary: Which one to use?
| Method | Best For | Key Libraries | Complexity |
|---|---|---|---|
| Filesystem Tree | Creating dummy data, testing, demos | os, shutil, random |
Low |
| Data Structure Tree | Algorithm practice, coding interviews | random (basic Python) |
Low-Medium |
Graph Tree (networkx) |
Graph theory, network analysis, complex simulations | networkx, matplotlib |
Medium |
