-
Notifications
You must be signed in to change notification settings - Fork 0
/
Graph_BFS.py
83 lines (63 loc) · 2.13 KB
/
Graph_BFS.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from collections import deque
class GraphNode(object):
def __init__(self, val):
self.value = val
self.children = []
def add_child(self, new_node):
self.children.append(new_node)
def remove_child(self, del_node):
if del_node in self.children:
self.children.remove(del_node)
class Graph(object):
def __init__(self, node_list):
self.nodes = node_list
def add_edge(self, node1, node2):
if node1 in self.nodes and node2 in self.nodes:
node1.add_child(node2)
node2.add_child(node1)
def remove_edge(self, node1, node2):
if node1 in self.nodes and node2 in self.nodes:
node1.remove_child(node2)
node2.remove_child(node1)
nodeG = GraphNode('G')
nodeR = GraphNode('R')
nodeA = GraphNode('A')
nodeP = GraphNode('P')
nodeH = GraphNode('H')
nodeS = GraphNode('S')
graph1 = Graph([nodeS, nodeH, nodeG, nodeP, nodeR, nodeA])
graph1.add_edge(nodeG, nodeR)
graph1.add_edge(nodeA, nodeR)
graph1.add_edge(nodeA, nodeG)
graph1.add_edge(nodeR, nodeP)
graph1.add_edge(nodeH, nodeG)
graph1.add_edge(nodeH, nodeP)
graph1.add_edge(nodeS, nodeR)
def bfs_search(root_node, search_value):
seen_nodes = list()
queue = deque()
node = root_node
node_value = node.value
if node_value == search_value:
return node
seen_nodes.append(node_value)
first_loop = True
while len(queue) > 0 or first_loop:
first_loop = False
for node_children in node.children:
if node_children.value not in seen_nodes:
node_value = node_children.value
if node_value == search_value:
return node_children
seen_nodes.append(node_value)
queue.append(node_value)
next_node_value = queue.popleft()
for node_children in node.children:
if node_children.value is next_node_value:
node = node_children
first_loop = True
break
return -1
assert nodeA == bfs_search(nodeS, 'A')
assert nodeS == bfs_search(nodeP, 'S')
assert nodeR == bfs_search(nodeH, 'R')