68
Binary Search Trees Berlin Chen 陳陳陳 陳陳陳陳陳陳陳陳陳 陳陳陳 陳陳陳陳陳陳http://www.csie.ntu.edu.tw/~ds/

Binary Search Trees

  • Upload
    eagan

  • View
    34

  • Download
    3

Embed Size (px)

DESCRIPTION

Binary Search Trees. Berlin Chen 陳柏琳 台灣師範大學資工系 副教授 參考資料來源: http://www.csie.ntu.edu.tw/~ds/. Binary Search Tree. Binary search tree Every element has a unique key The keys in a nonempty left subtree ( right subtree ) are smaller ( larger ) than the key in the root of subtree - PowerPoint PPT Presentation

Citation preview

Page 1: Binary Search Trees

Binary Search Trees

Berlin Chen 陳柏琳台灣師範大學資工系 副教授

參考資料來源:http://www.csie.ntu.edu.tw/~ds/

Page 2: Binary Search Trees

2

Binary Search Tree

• Binary search tree– Every element has a unique key

– The keys in a nonempty left subtree (right subtree) are smaller (larger) than the key in the root of subtree

– The left and right subtrees are also binary search trees• A recursive definition!

20

12 25

10 15

30

5 40

2

60

70

65 8022

Page 3: Binary Search Trees

3

Searching a Binary Search Tree

tree_pointer search(tree_pointer root, int key){/* return a pointer to the node that contains key. If ther

e is no such node, return NULL */

if (!root) return NULL;

if (key == root->data) return root;

if (key < root->data) return search(root->left_child, key);

return search(root->right_child,key);}

A Recursive Version

Each tree node:

- A key value (data)

- Two pointers to it

left and right children

Complexity: O(h)

Page 4: Binary Search Trees

4

Searching a Binary Search Tree

tree_pointer search2(tree_pointer tree, int key)

{

while (tree) {

if (key == tree->data) return tree;

if (key < tree->data)

tree = tree->left_child;

else tree = tree->right_child;

}

return NULL;

}

A Iterative Version

Page 5: Binary Search Trees

5

Searching a Binary Search Tree

• Search by rank permitted if– Each node have an additional field LeftSize which is 1 plus the n

umber of elements in the left subtree of the node

30

5 40

21

2

3

1

tree_pointer search3(tree_pointer tree, int rank)

{

while (tree) {

if (rank == tree->LeftSize) return tree;

if (rank < tree-> LeftSize)

tree = tree->left_child;

else

{

rank-= tree->LeftSize;

tree = tree->right_child;

}

}

return NULL;

}

Page 6: Binary Search Trees

6

Insert Node in Binary Search Tree

30

5 40

2

30

5 40

2 35 80

30

5 40

2 80

Insert 80 Insert 35

Page 7: Binary Search Trees

7

Insertion into A Binary Search Tree

void insert_node(tree_pointer *node, int num){tree_pointer ptr, temp = modified_search(*node, num); if (temp || !(*node)) { ptr = (tree_pointer) malloc(sizeof(node)); if (IS_FULL(ptr)) { fprintf(stderr, “The memory is full\n”); exit(1); } ptr->data = num; ptr->left_child = ptr->right_child = NULL; if (*node) if (num<temp->data) temp->left_child=ptr; else temp->right_child = ptr; else *node = ptr; }}

// Not NULL

// Return last visited tree node

Page 8: Binary Search Trees

8

Deletion for A Binary Search Tree

• Delete a leaf node

– The left (or right) child field of its parent is set to 0 and the node is simply disposed

30

5 40

2 35 80

30

5 40

2 80

Delete 35 Delete 8030

5 40

2

Page 9: Binary Search Trees

9

Deletion for A Binary Search Tree

• Delete a nonleaf node with only one child

– The node is deleted and the single-child takes the place of the disposed node

30

5 40

2 35 80

Delete 5 30

402

35 80

Page 10: Binary Search Trees

10

Deletion for A Binary Search Tree

• Delete a nonleaf node with only one child

2

T1

T2

1

X

T2

1

T1

Page 11: Binary Search Trees

11

Deletion for A Binary Search Tree

• Delete a nonleaf node that has two children

– The largest element in its left subtree or the smallest one in the right tree will replace the disposed mode

30

5 40

2 35 80

Delete 30 5

402

35 80

or 402

35

80

Page 12: Binary Search Trees

12

Deletion for A Binary Search Tree

• Delete a nonleaf node that has two children– Recursive adjustments might happen

40

20 60

10 30 50 70

45 55

52

40

20 55

10 30 50 70

45 52

Before deleting 60 After deleting 60

Page 13: Binary Search Trees

13

Exercise

• Implement a binary search which is equipped with– Insertion operation

– Search operation• Search by key• Search by Rank

– Deletion operation

Page 14: Binary Search Trees

14

Trie

A

D C B

EFGH

IJK

Tree A

BC

GH

D

K J

EF

I

Trie

struct DEF_TREE{ int Key; struct Tree *Child; struct Tree *Brother; struct Tree *Father;

};

Page 15: Binary Search Trees

15

Graphs

Berlin Chen 陳柏琳台灣師範大學資工所 助理教授

參考資料來源:http://www.csie.ntu.edu.tw/~ds/

Page 16: Binary Search Trees

16

Definition

• A graph G consists of two sets– A finite, nonempty set of vertices V(G)– A finite, possible empty set of edges E(G)– G(V,E) represents a graph

• An undirected graph (graph) is one in which the pair of vertices in a edge is unordered, (v0, v1) = (v1,v0)

• A directed graph (digraph) is one in which each edge is a directed pair of vertices, <v0, v1> != <v1,v0>

tail head

Page 17: Binary Search Trees

17

Examples for Graph

0

1 2

3

0

1

2

0

1 2

3 4 5 6G1

G2G3

V(G1)={0,1,2,3} E(G1)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}V(G2)={0,1,2,3,4,5,6} E(G2)={(0,1),(0,2),(1,3),(1,4),(2,5),(2,6)}V(G3)={0,1,2} E(G3)={<0,1>,<1,0>,<1,2>}

complete undirected graph: n(n-1)/2 edgescomplete directed graph: n(n-1) edges

complete graph incomplete graph

Page 18: Binary Search Trees

18

Complete Graph

• A complete graph is a graph that has the maximum number of edges

– For undirected graph with n vertices, the maximum number of edges is n(n-1)/2

– For directed graph with n vertices, the maximum number of edges is n(n-1)

– Example: G1 is a complete graph

0

1 2

3

G1

complete graph

Page 19: Binary Search Trees

19

Adjacent and Incident

• If (v0, v1) is an edge in an undirected graph– v0 and v1 are adjacent– The edge (v0, v1) is incident on vertices v0 and v1

• If <v0, v1> is an edge in a directed graph– v0 is adjacent to v1, and v1 is adjacent from v0

– The edge <v0, v1> is incident on v0 and v1

0

1

2

G3

0

1 2

3 4 5 6

G2

Page 20: Binary Search Trees

20

Loop and Multigraph

• Example of a graph with feedback loops and a multigraph (Figure 6.3)– Edges of the form (v, v) or <v, v> : self edge or self loop

0 2

1

(a)2

1

0

3

(b)

self edgemultigraph:multiple occurrencesof the same edge

Page 21: Binary Search Trees

21

Subgraph and Path

• A subgraph of G is a graph G’ such that V(G’) is a subset of V(G) and E(G’) is a subset of E(G)

• A path from vertex vp to vertex vq in a graph G, is a sequence of vertices, vp, vi1, vi2, ..., vin, vq, such that (vp, vi1), (vi1, vi2), ..., (vin, vq) are edges in an undirected graph

• The length of a path is the number of edges on it

Page 22: Binary Search Trees

22

0 0

1 2 3

1 2 0

1 2

3 (i) (ii) (iii) (iv) (a) Some of the subgraph of G1

0 0

1

0

1

2

0

1

2(i) (ii) (iii) (iv)

(b) Some of the subgraph of G3

分開單一

0

1 2

3

G1

0

1

2

G3

Figure 6.4: subgraphs of G1 and G3

Page 23: Binary Search Trees

23

Simple Path and Cycle

• A simple path is a path in which all vertices except possibly the first and the last are distinct

• A cycle is a simple path in which the first and the last vertices are the same

• In an undirected graph G, two vertices, v0 and v1, are connected if there is a path in G from v0 to v1

• An undirected graph is connected if, for every pair of distinct vertices vi, vj, there is a path from vi to vj

Page 24: Binary Search Trees

24

0

1 2

3

0

1 2

3 4 5 6G1

G2

connected

tree (acyclic graph)

Page 25: Binary Search Trees

25

Connected Component

• A connected component of an undirected graph is a maximal connected subgraph

• A tree is a graph that is connected and acyclic

• A directed graph is strongly connected if there is a directed path from vi to vj and also from vj to vi

• A strongly connected component is a maximal subgraph that is strongly connected

Page 26: Binary Search Trees

26

Figure 6.5: A graph with two connected components

1

0

2

3

4

5

6

7

H1 H2

G4 (not connected)

connected component (maximal connected subgraph)

Page 27: Binary Search Trees

27

Figure 6.6: Strongly connected components of G3

0

1

20

1

2

G3

not strongly connectedstrongly connected component

(maximal strongly connected subgraph)

Page 28: Binary Search Trees

28

Degree

• The degree of a vertex is the number of edges incident to that vertex

• For directed graph, – the in-degree of a vertex v is the number of edges

that have v as the head

– the out-degree of a vertex v is the number of edgesthat have v as the tail

– if di is the degree of a vertex i in a graph G with n vertices and e edges, the number of edges is

e din

( ) /0

1

2

Page 29: Binary Search Trees

29

undirected graph

degree0

1 2

3 4 5 6

G1 G2

3

2

3 3

1 1 1 1

directed graphin-degreeout-degree

0

1

2

G3

in:1, out: 1

in: 1, out: 2

in: 1, out: 0

0

1 2

3

33

3

Page 30: Binary Search Trees

30

ADT for Undirected Graph

structure Graph is objects: a nonempty set of vertices and a set of undirected edges, where each

edge is a pair of vertices

functions: for all graph Graph, v, v1 and v2 Vertices

Graph Create()::=return an empty graph

Graph InsertVertex(graph, v)::= return a graph with v inserted. v has no incident edge

Graph InsertEdge(graph, v1,v2)::= return a graph with new edge between v1 and v2

Graph DeleteVertex(graph, v)::= return a graph in which v and all edges incident to it are removed

Graph DeleteEdge(graph, v1, v2)::=return a graph in which the edge (v1, v2) is removed

Boolean IsEmpty(graph)::= if (graph==empty graph) return TRUE else return FALSE

List Adjacent(graph,v)::= return a list of all vertices that are adjacent to v

Page 31: Binary Search Trees

31

Graph Representations

• Adjacency Matrix• Adjacency Lists• Adjacency Multilists

Page 32: Binary Search Trees

32

Adjacency Matrix

• Let G=(V,E) be a graph with n vertices.

• The adjacency matrix of G is a two-dimensional n by n array, say adj_mat

• If the edge (vi, vj) is in E(G), adj_mat[i][j]=1

• If there is no such edge in E(G), adj_mat[i][j]=0

• The adjacency matrix for an undirected graph is symmetric; the adjacency matrix for a digraph need not be symmetric

Page 33: Binary Search Trees

33

Examples for Adjacency Matrix

0

1

1

1

1

0

1

1

1

1

0

1

1

1

1

0

0

1

0

1

0

0

0

1

0

0

1

1

0

0

0

0

0

1

0

0

1

0

0

0

0

1

0

0

1

0

0

0

0

0

1

1

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

1

0

1

0

0

0

0

0

0

1

0

1

0

0

0

0

0

0

1

0

G1

G2

G4

0

1 2

3

0

1

2

1

0

2

3

4

5

6

7

symmetric

undirected: n2/2directed: n2

Page 34: Binary Search Trees

34

Merits of Adjacency Matrix

• From the adjacency matrix, to determine the connection of vertices is easy

• The degree of a vertex is

• For a digraph, the row sum is the out_degree, while the column sum is the in_degree

adj mat i jj

n

_ [ ][ ]

0

1

1

0],[)(

n

ji ijAvind

1

0],[)(

n

ji jiAvoutd

sum up a column sum up a row

Page 35: Binary Search Trees

35

Data Structures for Adjacency Lists

#define MAX_VERTICES 50typedef struct node *node_pointer;typedef struct node { int vertex; struct node *link;};node_pointer graph[MAX_VERTICES];int n=0; /* vertices currently in use */

Each row in adjacency matrix is represented as an adjacency list

Page 36: Binary Search Trees

36

0123

012

01234567

1 2 30 2 30 1 30 1 2

G1

10 2

G3

1 20 30 31 254 65 76G4

0

1 2

3

0

1

2

1

0

2

3

4

5

6

7

An undirected graph with n vertices and e edges ==> n head nodes and 2e list nodes

Page 37: Binary Search Trees

37

Interesting Operations

• Degree of a vertex in an undirected graph– Number of nodes in adjacency list

• Number of edges in a graph– Determined in O(n+e)

• Out-degree of a vertex in a directed graph (digraph)– Number of nodes in its adjacency list

• In-degree of a vertex in a directed graph (digraph)– Traverse the whole data structure– Or maintained in inversed adjacency lists

Page 38: Binary Search Trees

38

Compact Representation

[0] 9 [8] 23 [16] 2[1] 11 [9] 1 [17] 5[2] 13 [10] 2 [18] 4[3] 15 [11] 0 [19] 6[4] 17 [12] 3 [20] 5[5] 18 [13] 0 [21] 7[6] 20 [14] 3 [22] 6[7] 22 [15] 1

1

0

2

3

4

5

6

7

0

1

2

3

45

6

7

node[0] … node[n-1]: starting point for vertices

node[n]: n+2e+1 (upper bound of the array)

The vertices adjacent from vertex i are stored in array indexed from node[i] to node[i+1]-1

Page 39: Binary Search Trees

39

Inverse Adjacency Lists

0

1

2

1 NULL

0 NULL

1 NULL

0

1

2

Determine in-degree of a vertex in a fast way.

Figure 6.10: Inverse adjacency lists for G3

Page 40: Binary Search Trees

40

• A simplified version of the list structure for sparse matrix representation

tail head column link for head row link for tail

Figure 6.11: Alternate node structure for adjacency lists

Information for an edge for in-degree information

for out-degree information

Page 41: Binary Search Trees

41

0 1 2

2 NULL

1

0

1 0 NULL

0 1 NULL NULL

1 2 NULL NULL

0

1

2

0

1

0

1

0

0

0

1

0

Figure 6.12: Orthogonal representation for graph G3

head nodes

(shown twice)

Page 42: Binary Search Trees

42

3 2 NULL 1 0

2 3 NULL 0 1

3 1 NULL 0 2

2 0 NULL 1 3

headnodes vertax link

Order is of no significance

0

1 2

3

Figure 6.13:Alternate order adjacency list for G1

Page 43: Binary Search Trees

43

Exercise

• P. 344 Exercises 2, 10

Page 44: Binary Search Trees

44

Adjacency Multilists

• An edge in an undirected graph is represented by two nodes in adjacency list representation.

• Adjacency Multilists– lists in which nodes may be shared among several lists

(an edge is shared by two different paths)

m vertex1 vertex2 list1 list2

A Boolean mark indicating whether

or not the edge has been examined

Page 45: Binary Search Trees

45

Example for Adjacency Multlists

Lists: vertex 0: N0->N1->N2 vertex 1: N0->N3->N4 vertex 2: N1->N3->N5 vertex 3: N2->N4->N5

0 1 N1 N3

0 2 N2 N3

0 3 N4

1 2 N4 N5

1 3 N5

2 3

N0

N1

N2

N3

N4

N5

0123

edge (0,1)

edge (0,2)

edge (0,3)

edge (1,2)

edge (1,3)

edge (2,3)

(1,0)

(2,0)

(3,0)

(2,1)

(3,1)

(3,2)

0

1 2

3 six edges

Page 46: Binary Search Trees

46

Some Graph Operations

• TraversalGiven G=(V,E) and vertex v, find all wV, such that w connects v– Depth First Search (DFS)

preorder tree traversal

– Breadth First Search (BFS)level order tree traversal

• Connected Components

• Spanning Trees

Page 47: Binary Search Trees

47

Example: Graph G and its adjacency lists

depth first search: v0, v1, v3, v7, v4, v5, v2, v6

breadth first search: v0, v1, v2, v3, v4, v5, v6, v7

• Figure 6.16: visit all vertices in G that are reachable form v0

Page 48: Binary Search Trees

48

Depth First Search (DFS, dfs)

void dfs(int v){ node_pointer w; visited[v]= TRUE; printf(“%5d”, v); for (w=graph[v]; w; w=w->link) if (!visited[w->vertex]) dfs(w->vertex);}

#define FALSE 0#define TRUE 1short int visited[MAX_VERTICES];

Data structureadjacency list: O(e)adjacency matrix: O(n2)

A Recursive Function

Page 49: Binary Search Trees

49

Breadth First Search (BFS, bfs)

typedef struct queue *queue_pointer;

typedef struct queue {

int vertex;

queue_pointer link;

};

void addq(queue_pointer *, queue_pointer *, int);

int deleteq(queue_pointer *);

Page 50: Binary Search Trees

50

Breadth First Searchvoid bfs(int v){ node_pointer w; queue_pointer front, rear; front = rear = NULL; printf(“%5d”, v); visited[v] = TRUE; addq(&front, &rear, v);

adjacency list: O(e)adjacency matrix: O(n2)

while (front) { v= deleteq(&front); for (w=graph[v]; w; w=w->link) if (!visited[w->vertex]) { printf(“%5d”, w->vertex); addq(&front, &rear, w->vertex); visited[w->vertex] = TRUE; } }}

Page 51: Binary Search Trees

51

Connected Components

void connected(void){ for (i=0; i<n; i++) visited[i]=0;

for (i=0; i<n; i++) { if (!visited[i]) { dfs(i); printf(“\n”); } }}

adjacency list: O(n+e)adjacency matrix: O(n2)

Page 52: Binary Search Trees

52

Exercise

• Implement DFS and BFS• Implement a function to determine the connected

components for a graph

0

1 2

3 4 5 6

7

1

0

2

3

4

5

6

7

Page 53: Binary Search Trees

53

Spanning Trees

• When graph G is connected, a depth first or breadth first search starting at any vertex will visit all vertices in G– Form a tree that includes all the vertices of G

• A spanning tree is any tree that consists solely of edges in G and that includes all the vertices

• E(G): T (tree edges) + N (nontree edges)where T: set of edges used during search

N: set of remaining edges

Page 54: Binary Search Trees

54

Examples of Spanning Tree

0

1 2

3

0

1 2

3

0

1 2

3

0

1 2

3

G1

Possible spanning trees

Page 55: Binary Search Trees

55

Spanning Trees

• Either DFS or BFS can be used to create a spanning tree

– When DFS is used, the resulting spanning tree is known as a depth first spanning tree

– When BFS is used, the resulting spanning tree is known as a breadth first spanning tree

• While adding a nontree edge into any spanning tree, this will create a cycle

Page 56: Binary Search Trees

56

DFS VS. BFS Spanning Tree

0

1 2

3 4 5 6

7

0

1 2

3 4 5 6

7

DFS Spanning BFS Spanning

0

1 2

3 4 5 6

7 nontree edgecycle

Page 57: Binary Search Trees

57

Biconnected Graph

• A spanning tree is a minimal subgraph, G’, of G such that V(G’)=V(G) and G’ is connected

• Any connected graph with n vertices must have at least n-1 edges

• A biconnected graph is a connected graph that has no articulation points

0

1 2

3 4 5 6

7

biconnected graph

Page 58: Binary Search Trees

58

Articulation Point

• A vertex v is an articulation point iff the deletion of v, together with the deletion of all edges incident to v, leaves behind a graph has at least two connected components

0

1 2

3 4 5 6

Page 59: Binary Search Trees

59

biconnected component: a maximal connected subgraph H(no subgraph that is both biconnected and properly contains H)

1

3 5

6

0 8 9

7 2

4

1

0

1

3

2

4

3 5

8

7

9

7

5

6

7

biconnected componentsTwo biconnected components can

at most have one vertex at common

Page 60: Binary Search Trees

60

Find biconnected component of a connected undirected graphby depth first spanning tree

8 9

1

4 0

3 0 5 3 5

4 61 6

9 8 9 8

7 7

3

4 5

7

6

9 8

2

0

1

0

6

7

1 5

2

4

3

(a) depth first spanning tree (b)

2 2

dfndepthfirst

number

nontreeedge

(back edge)

nontreeedge

(back edge)

If u is an ancestor of v then dfn(u) < dfn(v)

Page 61: Binary Search Trees

61

Minimum Cost Spanning Tree

• The cost of a spanning tree of a weighted undirected graph is the sum of the costs of the edges in the spanning tree

• A minimum cost spanning tree is a spanning tree of least cost

• Three different algorithms can be used– Kruskal– Prim– Sollin

Select n-1 edges from a weighted graphof n vertices with minimum cost.

Page 62: Binary Search Trees

62

Greedy Strategy

• An optimal solution is constructed in stages

• At each stage, the best decision is made at thistime

• Since this decision cannot be changed later, we make sure that the decision will result in a feasible solution

• Typically, the selection of an item at each stage is based on a least cost or a highest profit criterion

Page 63: Binary Search Trees

63

Kruskal’s Idea

• Build a minimum cost spanning tree T by adding edges to T one at a time

• Select the edges for inclusion in T in nondecreasing order of the cost

• An edge is added to T if it does not form a cycle

• Since G is connected and has n > 0 vertices, exactly n-1 edges will be selected

Page 64: Binary Search Trees

64

Examples for Kruskal’s Algorithm

0

1

2

34

5 6

0

1

2

34

5 6

28

16

121824

22

25

1014

0

1

2

34

5 6

10

0 5

2 3

1 6

1 2

3 6

3 4

4 6

4 5

0 1

10

12

14

16

18

22

24

25

286/9

Page 65: Binary Search Trees

65

Examples for Kruskal’s Algorithm

0

1

2

34

5 6

10

12

0

1

2

34

5 6

10

12

14

0

1

2

34

5 6

10

12

14 16

0 5

2 3

1 6

1 2

3 6

3 4

4 6

4 5

0 1

10

12

14

16

18

22

24

25

28 + 3 6cycle

Page 66: Binary Search Trees

66

Examples for Kruskal’s Algorithm0 5

2 3

1 6

1 2

3 6

3 4

4 6

4 5

0 1

10

12

14

16

18

22

24

25

28

0

1

2

34

5 6

10

12

14 16

22

0

1

2

34

5 6

10

12

14 16

22

25

4 6

cycle

+

cost = 10 +25+22+12+16+14

Page 67: Binary Search Trees

67

Kruskal’s Algorithm

T= {};while (T contains less than n-1 edges

&& E is not empty) {choose a least cost edge (v,w) from E;delete (v,w) from E;if ((v,w) does not create a cycle in T) add (v,w) to T else discard (v,w);}if (T contains fewer than n-1 edges) printf(“No spanning tree\n”);

Page 68: Binary Search Trees

68

Exercise

• The missionaries and cannibals problem is usually stated as follows. Three missionaries and three cannibals are on one side of a river, along with a boat that can hold one or two people. Find a way to get every one to the other side, without leaving a group of missionaries in one place outnumbered by the cannibals in that place.