Trees
Definition of a tree A tree is a node with a value and zero or more children Depending on the needs of the program, the children may or may not be ordered A tree has a root, internal nodes, and leaves Each node contains an element and has branches leading to other nodes (its children) Each node (other than the root) has a parent Each node has a depth (distance from the root) A C B D E G F H J K I L M N
More definitions An empty tree has no nodes The descendents of a node are its children and the descendents of its children The ancestors of a node are its parent (if any) and the ancestors of its parent The subtree rooted at a node consists of the given node and all its descendents An ordered tree is one in which the order of the children is important; an unordered tree is one in which the children of a node can be thought of as a set The branching factor of a node is the number of children it has The branching factor of a tree is the average branching factor of its nodes
Data structure for a tree Each node in a tree has an arbitrary number of children, so we need something that will hold an arbitrary number of nodes, such as an ArrayList class Tree<V> { V value; ArrayList children; } If we don’t care about the order of children, we might use a Set instead of a ArrayList
ADT for a tree It must be possible to: Construct a new tree If a tree can be empty, this may require a header node Add a child to a node Get (iterate through) the children of a node Access (get and set) the value in a node It should probably be possible to: Remove a child (and the subtree rooted at that child) Get the parent of a node
File systems File systems are almost always implemented as a tree structure The nodes in the tree are of (at least) two types: folders (or directories), and plain files A folder typically has children—subfolders and plain files A folder also contains a link to its parent—in both Windows and UNIX, this link is denoted by .. In UNIX, the root of the tree is denoted by / A plain file is typically a leaf
Family trees It turns out that a tree is not a good way to represent a family tree Every child has two parents, a mother and a father Parents frequently remarry An “upside down” binary tree almost works Since it is a biological fact (so far) that every child has exactly two parents, we can use left child = father and right child = mother The terminology gets a bit confusing If you could go back far enough, it becomes a mathematical certainty that the mother and father have some ancestors in common
Part of a genealogy Elaine Pauline Chester Eugene Paula Carol David Winfred Danielle Steven Isaac
Game trees Trees are used heavily in implementing games, particularly board games A node represents a position on the board The children of a node represent all the possible moves from that position More precisely, the branches from a node represent the possible moves; the children represent the new positions Planning ahead (in a game) means choosing a path through the tree However— You can’t have a cycle in a tree If you can return to a previous position in a game, you have a cycle Graphs can have cycles
Trees for expressions and statements Examples: The statement if (x > y) max = x; else max = y; y if > x max = The expression x > y ? x : y ?: > x y
More trees for statements while (n >= 1) { exp = x * exp; n--; } for (int i = 0; i < n; i++) a[i] = 0; for i int = a [ ] n ++ < while >= n 1 exp * = -- x ;
The End