A tree is a non-linear structure for hierarchical relationships: nodes connected by edges where every node except one designated root has exactly one parent, and there are no cycles. Children point downward; data flows from root to leaves.

Trees model anything with a parent/child relationship: family genealogies, file systems, organization charts, expression parsing, decision logic. The recursive structure (a tree is a root with sub-trees as children, each itself a tree) makes recursion the natural way to operate on them.

Anatomy

  • Node: a single element holding data and pointers to its children.
  • Root: the topmost node. Has no parent.
  • Leaf: a node with no children.
  • Internal node: a node that’s not a leaf (has at least one child).
  • Edge: the connection between a parent and child, drawn as a line, implemented as a pointer.
  • Path: a sequence of nodes from one ancestor down to a descendant. Exactly one path exists from the root to any node.
  • Subtree: a node and all of its descendants — itself a tree.

Sample tree structures:

An expression tree representing . Internal nodes are operators; leaves are operands. Evaluating the tree (in postfix-traversal order) computes the expression.

A decision tree for classifying animals. Each internal node asks a yes/no question; each branch is the answer; each leaf is a final classification.

Measurements

  • Height of a node: number of edges on the longest path from that node down to a leaf. Height of a leaf is 0; height of the tree is the height of the root.
  • Depth of a node: number of edges from the root to that node. Depth of the root is 0.
  • Level of a node: depth + 1. Root is level 1, its children are level 2, etc.

For a tree with height , the maximum number of nodes depends on the maximum branching factor:

  • Binary tree (max 2 children per node): up to nodes — a perfect tree.
  • General -ary tree (max children per node): up to nodes.

The formula is the binary special case. Don’t apply it to general trees with arbitrary branching.

Implementation

For a binary tree (each node has at most two children):

typedef struct node {
    int          data;
    struct node *left;
    struct node *right;
} node;
 
node *newNode(int data) {
    node *nptr = (node *) malloc(sizeof(node));
    nptr->data  = data;
    nptr->left  = NULL;
    nptr->right = NULL;
    return nptr;
}

For a tree where nodes can have arbitrary numbers of children, you’d use a list or array of children instead of fixed left/right.

Types of trees

  • Binary tree: each node has at most 2 children.
  • Full binary tree: every node has either 0 or 2 children (no node with just one child).
  • Complete binary tree: every level except possibly the last is fully filled; the last level fills left to right. (See heaps — they’re complete binary trees.)
  • Binary search tree: a binary tree with the BST ordering invariant.
  • AVL tree: a self-balancing BST.
  • Red-black tree: another self-balancing BST.

Operations

  • Traversal: visit every node. See Binary tree traversal for the four standard orders.
  • Search: find a node containing a specific value.
  • Insert: add a new node, possibly maintaining a structural invariant (e.g., BST order, AVL balance).
  • Delete: remove a node and reorganize as needed.

The trick: trees are recursive by nature. An operation on a tree is typically the same operation applied to subtrees, plus some local work at the current node. See Recursion for why this matches.

Where trees show up

Reach for a tree when you need:

  • Hierarchy: file systems, DOM trees, scene graphs, organization structures.
  • Ordered storage with fast lookup: BSTs and balanced variants give search/insert/delete.
  • Priority access: heaps for priority queues.
  • Decision making: classification, expression parsing.

Generalize the other way and you get a Graph, where nodes can have multiple parents.