Week 03 Tutorial Questions
Balanced Trees, Graph Basics
Balancing Trees
-
Show how the following tree would change if we do a right rotation on the node containing 10 followed by a left rotation on the node containing 6.
-
Show the result of performing the insert-at-root operation with the value 7 in this binary search tree:
AVL Trees
AVL trees use the following node definition:
struct node {
int data;
int height;
struct node *left;
struct node *right;
};
You may find these resources on AVL trees useful:
- AVL tree visualization
- VisuAlgo's AVL tree visualizer (click on AVL tree)
-
For the following AVL tree, annotate each node with the height of its subtree.
Now starting from the initial tree each time, insert the following integers:
0 2 10 17
-
Show how an AVL tree would be constructed if the following values were inserted into an initially empty tree in the order given:
12 10 8 6 4 2
-
Using an AVL tree, design an algorithm to determine if an array contains two elements that sum to a given value.
- Write the algorithm in pseudocode.
- Analyse the time complexity of your algorithm.
Graph Representation
-
Consider the following graph
The edges are labelled simply for convenience in describing graph properties.
- How many edges does it have?
- How many cycles are there in the graph?
- How many cliques are there in the graph?
- What is the degree of each vertex?
-
How many edges in the longest path from 5 to 8?
(without traversing any edge more than once)
-
For each of the following graphs:
Show the concrete data structures if the graph was implemented via:
- adjacency matrix representation (assume a full \( V \times V \) matrix)
- adjacency list representation (if non-directional, include both \( (v, w) \) and \( (w, v) \))
-
How is the adjacency matrix for a directed graph different to that for an undirected graph?
-
Facebook could be considered as a giant "social graph"
- What are the vertices?
- What are the edges?
- Are edges directional?
- What does the degree of each vertex represent?
- What kind of graph algorithm could suggest potential friends?
Graph Traversal
-
Consider the breadth-first and depth-first traversal algorithms below and the following graph:
void breadthFirst(Graph g, int src) { bool *visited = calloc(g->nV, sizeof(bool)); int *pred = calloc(g->nV, sizeof(int)); Queue q = QueueNew(); visited[src] = true; QueueEnqueue(q, src); while (!QueueIsEmpty(q)) { int v = QueueDequeue(q); printf("%d\n", v); for (int w = 0; w < g->nV; w++) { if (g->edges[v][w] && !visited[w]) { visited[w] = true; pred[w] = v; QueueEnqueue(q, w); } } } free(visited); free(pred); QueueFree(q); }
void depthFirst(Graph g, int src) { bool *visited = calloc(g->nV, sizeof(bool)); int *pred = calloc(g->nV, sizeof(int)); Stack s = StackNew(); StackPush(s, src); while (!StackIsEmpty(s)) { int v = StackPop(s); if (visited[v]) continue; visited[v] = true; printf("%d\n", v); for (int w = g->nV - 1; w >= 0; w--) { if (g->edges[v][w] && !visited[w]) { pred[w] = v; StackPush(s, w); } } } free(visited); free(pred); StackFree(s); }
Trace the execution of the traversal algorithms, and show the state of the
visitedandpredarrays and theQueue(BFS) orStack(DFS) at the end of each iteration, for each of the following function calls:breadthFirst(g, 0); breadthFirst(g, 3); depthFirst(g, 0); depthFirst(g, 3);