Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Trees and Graphs
Trees, Binary Search Trees, Balanced Trees, Graphs
Graph Fundamentals
Telerik Algo Academy
http://academy.telerik.com
Table of Contents
1.
Tree-like Data Structures
2.
Trees and Related Terminology
3.
Traversing Trees
4.
Graphs
Graph Definitions
Representing Graphs
Graph Traversal Algorithms
Connected Components
2
Tree-like Data Structures
Trees, Balanced Trees, Graphs, Networks
Tree-like Data Structures
Tree-like data structures are
Branched recursive data structures
Consisting of nodes
Each node can be connected to other nodes
Examples of tree-like structures
Trees: binary / other degree, balanced, etc.
Graphs: directed / undirected, weighted, etc.
Networks
4
Tree-like Data Structures
Network
Tree
2
1
Project
Manager
6
3
Team
Leader
Developer
1
Designer
Developer
3
QA Team
Leader
4
5
Tester
2
Tester 1
Developer
2
7
1
14
4
21
Graph
11
12
19
31
5
Trees and Related
Terminology
Node, Edge, Root, Children, Parent, Leaf ,
Binary Search Tree, Balanced Tree
Trees
Tree data structure – terminology
Node, edge, root, child, children, siblings, parent,
ancestor, descendant, predecessor, successor,
internal node, leaf, depth, height, subtree
Depth 0
17
9
Height = 3
6
15
14
5
8
Depth 1
Depth 2
7
Binary Trees
Binary
trees: most widespread form
Each node has at most 2 children
Root node
Right child
17
Left subtree
9
6
Right child
15
5
8
10
Left child
8
Tree Traversals
DFS and BFS Traversals
Tree Traversal Algorithms
Traversing
a tree means to visit each of its
nodes exactly one in particular order
Many traversal algorithms are known
Depth-First Search (DFS)
Visit node's successors first
Usually implemented by recursion
Breadth-First Search (BFS)
Nearest nodes visited first
Implemented by a queue
16
Depth-First Search (DFS)
Depth-First Search
first visits all descendants
of given node recursively, finally visits the
node itself
DFS algorithm
pseudo code
9
7
DFS(node)
{
for each child c of node
DFS(c);
print the current node;
}
5
4
19
2
1
1
21
3
12
8
6
31
14
7
23
6
17
DFS in Action (Step 1)
Stack: 7
Output: (empty)
7
19
1
12
21
31
14
23
6
18
DFS in Action (Step 2)
Stack: 7, 19
Output: (empty)
7
19
1
12
21
31
14
23
6
19
DFS in Action (Step 3)
Stack: 7, 19, 1
Output: (empty)
7
19
1
12
21
31
14
23
6
20
DFS in Action (Step 4)
Stack: 7, 19
Output: 1
7
19
1
12
21
31
14
23
6
21
DFS in Action (Step 5)
Stack: 7, 19, 12
Output: 1
7
19
1
12
21
31
14
23
6
22
DFS in Action (Step 6)
Stack: 7, 19
Output: 1, 12
7
19
1
12
21
31
14
23
6
23
DFS in Action (Step 7)
Stack: 7, 19, 31
Output: 1, 12
7
19
1
12
21
31
14
23
6
24
DFS in Action (Step 8)
Stack: 7, 19
Output: 1, 12, 31
7
19
1
12
21
31
14
23
6
25
DFS in Action (Step 9)
Stack: 7
Output: 1, 12, 31, 19
7
19
1
12
21
31
14
23
6
26
DFS in Action (Step 10)
Stack: 7, 21
Output: 1, 12, 31, 19
7
19
1
12
21
31
14
23
6
27
DFS in Action (Step 11)
Stack: 7
Output: 1, 12, 31, 19, 21
7
19
1
12
21
31
14
23
6
28
DFS in Action (Step 12)
Stack: 7, 14
Output: 1, 12, 31, 19, 21
7
19
1
12
21
31
14
23
6
29
DFS in Action (Step 13)
Stack: 7, 14, 23
Output: 1, 12, 31, 19, 21
7
19
1
12
21
31
14
23
6
30
DFS in Action (Step 14)
Stack: 7, 14
Output: 1, 12, 31, 19, 21, 23
7
19
1
12
21
31
14
23
6
31
DFS in Action (Step 15)
Stack: 7, 14, 6
Output: 1, 12, 31, 19, 21, 23
7
19
1
12
21
31
14
23
6
32
DFS in Action (Step 16)
Stack: 7, 14
Output: 1, 12, 31, 19, 21, 23, 6
7
19
1
12
21
31
14
23
6
33
DFS in Action (Step 17)
Stack: 7
Output: 1, 12, 31, 19, 21, 23, 6, 14
7
19
1
12
21
31
14
23
6
34
DFS in Action (Step 18)
Stack: (empty)
Output: 1, 12, 31, 19, 21, 23, 6, 14, 7
Traversal finished
7
19
1
12
21
31
14
23
6
35
Breadth-First Search (BFS)
Breadth-First Search first visits
the neighbor
nodes, later their neighbors, etc.
BFS algorithm pseudo code
BFS(node)
{
queue node
while queue not empty
v queue
print v
for each child c of v
queue c
}
1
7
3
2
19
6
5
1
21
7
12
4
8
31
14
9
23
6
36
BFS in Action (Step 1)
Queue: 7
Output: 7
7
19
1
12
21
31
14
23
6
37
BFS in Action (Step 2)
Queue: 7, 19
Output: 7
7
19
1
12
21
31
14
23
6
38
BFS in Action (Step 3)
Queue: 7, 19, 21
Output: 7
7
19
1
12
21
31
14
23
6
39
BFS in Action (Step 4)
Queue: 7, 19, 21, 14
Output: 7
7
19
1
12
21
31
14
23
6
40
BFS in Action (Step 5)
Queue: 7, 19, 21, 14
Output: 7, 19
7
19
1
12
21
31
14
23
6
41
BFS in Action (Step 6)
Queue: 7, 19, 21, 14, 1
Output: 7, 19
7
19
1
12
21
31
14
23
6
42
BFS in Action (Step 7)
Queue: 7, 19, 21, 14, 1, 12
Output: 7, 19
7
19
1
12
21
31
14
23
6
43
BFS in Action (Step 8)
Queue: 7, 19, 21, 14, 1, 12, 31
Output: 7, 19
7
19
1
12
21
31
14
23
6
44
BFS in Action (Step 9)
Queue: 7, 19, 21, 14, 1, 12, 31
Output: 7, 19, 21
7
19
1
12
21
31
14
23
6
45
BFS in Action (Step 10)
Queue: 7, 19, 21, 14, 1, 12, 31
Output: 7, 19, 21, 14
7
19
1
12
21
31
14
23
6
46
BFS in Action (Step 11)
Queue: 7, 19, 21, 14, 1, 12, 31, 23
Output: 7, 19, 21, 14
7
19
1
12
21
31
14
23
6
47
BFS in Action (Step 12)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14
7
19
1
12
21
31
14
23
6
48
BFS in Action (Step 13)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1
7
19
1
12
21
31
14
23
6
49
BFS in Action (Step 14)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1, 12
7
19
1
12
21
31
14
23
6
50
BFS in Action (Step 15)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1, 12, 31
7
19
1
12
21
31
14
23
6
51
BFS in Action (Step 16)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1, 12, 31, 23
7
19
1
12
21
31
14
23
6
52
BFS in Action (Step 16)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1, 12, 31, 23, 6
7
19
1
12
21
31
14
23
6
53
BFS in Action (Step 17)
Queue: 7, 19, 21, 14, 1, 12, 31, 23, 6
Output: 7, 19, 21, 14, 1, 12, 31, 23, 6
7
19
1
12
21
31
The
queue is
empty
stop
14
23
6
54
Binary Trees DFS Traversals
DFS traversal
of binary trees can be done in preorder, in-order and post-order
17
9
6
19
12
25
Pre-order: root, left, right 17, 9, 6, 12, 19, 25
In-order: left, root, right 6, 9, 12, 17, 19, 25
Post-order: left, right, root 6, 12, 9, 25, 19, 17
55
Iterative DFS and BFS
What will happen if in the Breadth-First Search
(BFS) algorithm a stack is used instead of queue?
An iterative Depth-First Search (DFS) – in-order
BFS(node)
{
queue node
while queue not empty
v queue
print v
for each child c of v
queue c
}
DFS(node)
{
stack node
while stack not empty
v stack
print v
for each child c of v
stack c
}
56
Graphs
Definitions, Representation, Traversal Algorithms
Graph Data Structure
Set of nodes with many-to-many relationship
between them is called graph
Each node has multiple predecessors
Each node has multiple successors
Node with multiple
predecessors
Node with
multiple
successors
7
1
14
4
21
11
12
19
31
58
Graph Definitions
Node (vertex)
Node
Element of graph
Can have name or value
A
Keeps a list of adjacent nodes
Edge
Edge
Connection between two nodes
Can be directed / undirected
A
B
Can be weighted / unweighted
Can have name / value
59
Graph Definitions (2)
Directed graph
Undirected graph
Edges have direction
22
2
3
A
F
J
7
1
4
D
G
21
12
3
Undirected edges
19
E
C
H
60
Graph Definitions (3)
Weighted graph
Weight (cost) is associated with each edge
10
A
6
Q
D
E
14
F
16
4
5
J
8
7
9
C
G
N
22
3
H
K
61
Graph Definitions (4)
Path (in undirected graph)
Sequence of nodes n1, n2, … nk
Edge exists between each pair of nodes ni, ni+1
Examples:
A, B, C is a path
B
H, K, C is not a path
A
C
K
G
H
N
62
Graph Definitions (5)
Path (in directed graph)
Sequence of nodes n1, n2, … nk
Directed edge exists between each pair of
nodes ni, ni+1
Examples:
A, B, C is a path
A, G, K is not a path
B
A
C
K
G
H
N
63
Graph Definitions (6)
Cycle
Path that ends back at the starting node
Example:
A, B, C, G, A
B
Simple path
No cycles in path
A
C
K
G
Acyclic graph
Graph with no cycles
H
N
Acyclic undirected graphs are trees
64
Graph Definitions (7)
Two nodes are
reachable if
Unconnected
graph with two
connected
components
Path exists between them
Connected graph
Every node is reachable from any other node
Connected graph
A
F
J
F
A
J
D
G
D
E
G
C
H
65
Graphs and Their Applications
Graphs have many real-world applications
Modeling a computer network like Internet
Routes are simple paths in the network
Modeling a city map
Streets are edges, crossings are vertices
Social networks
People are nodes and their connections are edges
State machines
States are nodes, transitions are edges
66
Representing Graphs
Adjacency list
Each node holds a
list of its neighbors
Adjacency matrix
Each cell keeps
whether and how two
nodes are connected
1
2
3
4
Set of edges
{2, 4}
{3}
{1}
{2}
1
2
3
4
1
0
1
0
1
2
0
0
1
0
3
1
0
0
0
4
0
1
0
0
3
2
1
4
{1,2} {1,4} {2,3} {3,1} {4,2}
67
Representing Graphs in C#
public class Graph
{
int[][] childNodes;
public Graph(int[][] nodes)
{
this.childNodes = nodes;
}
}
Graph
new
new
new
new
new
new
new
});
6
0
3
1
4
5
2
g = new Graph(new int[][] {
int[] {3, 6}, // successors of vertice 0
int[] {2, 3, 4, 5, 6}, // successors of vertice 1
int[] {1, 4, 5}, // successors of vertice 2
int[] {0, 1, 5}, // successors of vertice 3
int[] {1, 2, 6}, // successors of vertice 4
int[] {1, 2, 3}, // successors of vertice 5
int[] {0, 1, 4} // successors of vertice 6
68
Graph Traversal Algorithms
Depth-First Search (DFS) and Breadth-First
Search (BFS) can traverse graphs
Each vertex should be is visited at most once
BFS(node)
{
queue node
visited[node] = true
while queue not empty
v queue
print v
for each child c of v
if not visited[c]
queue c
visited[c] = true
}
DFS(node)
{
stack node
visited[node] = true
while stack not empty
v stack
print v
for each child c of v
if not visited[c]
stack c
visited[c] = true
}
69
Recursive DFS Graph Traversal
void TraverseDFSRecursive(node)
{
if (not visited[node])
{
visited[node] = true
print node
foreach child node c of node
{
TraverseDFSRecursive(c);
}
}
}
vois Main()
{
TraverseDFS(firstNode);
}
70
Graphs and Traversals
Live Demo
Connectivity
Connecting the chain
Connectivity
Connected component of undirected graph
A sub-graph in which any two nodes are
connected to each other by paths
73
Connectivity (2)
A simple way to find number of connected
components
A loop through all nodes and start a DFS or BFS
traversing from any unvisited node
Each time you start a new traversing
You find a new connected component!
74
Connectivity (3)
Algorithm:
foreach node from graph G
{
if node is unvisited
{
DFS(node);
countOfComponents++;
}
}
*Note: Do not forget to mark each node in the DFS as visited!
A
F
C
H
D
G
75
Connectivity (4)
Connected graph
A graph with only one connected
component
In every connected graph a path
exists between any two nodes
Checking whether a graph is
connected
If DFS / BFS passes through all
vertices graph is connected!
76
Summary
Trees are recursive data structure – node with set
of children which are also nodes
Binary Search Trees are ordered binary trees
Balanced trees have weight of log(n)
Graphs are sets of nodes with many-to-many
relationship between them
Can be directed/undirected, weighted /
unweighted, connected / not connected, etc.
Tree / graph traversals can be done by Depth-First
Search (DFS) and Breadth-First Search (BFS)
77
Trees and Graphs
Questions?
http://algoacademy.telerik.com