MCS 275 Spring 2022
David Dumas
Course bulletins:
One way to write splittings
and splittings_iterative
is to use the fact that a splitting of n
can be turned into a splitting of n+1
in two ways.
I think the easiest way to write splittings_distinct
is to first write splittings_distinct_into
and then have splittings_distinct
call it.
(e.g. splittings_distinct(5)
is the same thing as splittings_distinct_into(5,[1,2,3,4,5])
We've talked about some recursive algorithms
Recursive data structures!
A sequence of instructions that accomplishes a certain computation (e.g. find the square root of $n$) or solves a class of problems (e.g. given a list, find its largest element).
In mathematics, a graph is a collection of nodes (or vertices) and edges (which join pairs of nodes).
A graph is connected if every pair of nodes can be joined by at least one path.
A graph is connected if every pair of nodes can be joined by at least one path.
A tree is a graph where every pair of nodes can be joined by exactly one path (no more, no less).
A tree is a graph where every pair of nodes can be joined by exactly one path (no more, no less).
Equivalently, a tree is a connected graph with no loops.
Equivalently, a tree is a connected graph that becomes disconnected if any edge is removed.
(Exercise: Prove this is an equivalent definition!)
The random mazes produced by maze.PrimRandomMaze(...)
can be seen as trees, with the nodes being the open squares and edges between nodes if the corresponding squares share an edge.
The trees considered in CS usually have one node distinguished, called the root.
There's nothing special about the root except that it is labeled as such. Any node of a tree could be chosen to be its root node.
Such rooted trees are usually drawn with the root at top
and vertices farther from the root successively lower.
Such diagrams look like trees in the natural world.
Choosing a root lets us orient all of the edges so they point away from it.
Hence the usual way of drawing a tree will have these arrows pointing downward.
Each node (except the root) has an incoming edge, from its parent (closer to the root).
Each node may have one or more outgoing edges, to its children (farther from the root).
In CS, a binary tree is a (rooted) tree in which every node has ≤ 2 children, labeled "left" and "right".
Horizontal relative position is used to indicate this labeling, rather than explicitly writing it on the edges.
In CS, a binary tree is a (rooted) tree in which every node has ≤ 2 children, labeled "left" and "right".
Horizontal relative position is used to indicate this labeling, rather than explicitly writing it on the edges.
How can we store a tree in Python?
Make a class Node
, with attribues left
and right
that can be None
or other Node
objects.
We can also store additional information in the nodes of a binary tree. If present, this is called the key or value or cargo of a node.
This turns out to be a very efficient data structure for many purposes. A lot of data can be accessed in a few steps from the root node.
Stores numbers or other objects allowing comparison as node values. Enforce the rule: Anything in the subtree to the left is smaller or equal. Anything in the subtree to the right is greater.
This allows a natural way to check if a value is present with a game of "too high / too low".