51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Breadth-First Search | |||
|  | localeTitle: Поиск по ширине | |||
|  | --- | |||
|  | ## Поиск по ширине
 | |||
|  | 
 | |||
|  | Давайте сначала определим класс `Tree` который будет использоваться для реализации алгоритма первого поиска Breadth. | |||
|  | 
 | |||
|  | ```python | |||
|  | class Tree:  | |||
|  |   def __init__(self, x):  | |||
|  |     self.val = x  | |||
|  |     self.left = None  | |||
|  |     self.right = None  | |||
|  | ``` | |||
|  | 
 | |||
|  | Алгоритм поиска ширины ширины перемещается с одного уровня на другой, начиная с корня дерева. Мы будем использовать для этого `queue` . | |||
|  | 
 | |||
|  | ```python | |||
|  | def bfs(root_node):  | |||
|  |   queue = [root_node]  | |||
|  |   | |||
|  |   while queue:  | |||
|  |     top_element = queue.pop()  | |||
|  |     print("Node processed: ",top_element)  | |||
|  |   | |||
|  |     if top_element.left:  | |||
|  |       queue.append(top_element.left)  | |||
|  |   | |||
|  |     if top_element.right:  | |||
|  |       queue.append(top_element.right)  | |||
|  | ``` | |||
|  | 
 | |||
|  | Мы можем легко изменить приведенный выше код, чтобы напечатать уровень каждого узла. | |||
|  | 
 | |||
|  | ```python | |||
|  | def bfs(root_node):  | |||
|  |   queue = [(root_node, 0)]  | |||
|  |   | |||
|  |   while queue:  | |||
|  |     top_element, level = queue.pop()  | |||
|  |     print("Node processed: {} at level {}".format(top_element, level))  | |||
|  |   | |||
|  |     if top_element.left:  | |||
|  |       queue.append((top_element.left, level + 1))  | |||
|  |   | |||
|  |     if top_element.right:  | |||
|  |       queue.append((top_element.right, level + 1))  | |||
|  | ``` | |||
|  | 
 | |||
|  | | Сложность | Время | Космос | | ----- | ------ | ------ | | BFS | n | n | |