Дерево против графика: методы и примеры кода для понимания и управления иерархическими и нелинейными структурами данных

Под термином «дерево и график» подразумевается сравнение двух фундаментальных структур данных, используемых в информатике. Дерево — это иерархическая структура данных, состоящая из узлов, соединенных ребрами, с одним корневым узлом и ветвящейся структурой. С другой стороны, граф — это нелинейная структура данных, состоящая из узлов и ребер, которые могут иметь произвольные связи.

Вот несколько методов с примерами кода для понимания и работы с деревьями и графами:

  1. Методы обхода дерева:

    • Обход предварительного заказа:

      def preorder(node):
       if node is not None:
           print(node.value)
           preorder(node.left)
           preorder(node.right)
    • Обход по порядку:

      def inorder(node):
       if node is not None:
           inorder(node.left)
           print(node.value)
           inorder(node.right)
    • Обход после заказа:

      def postorder(node):
       if node is not None:
           postorder(node.left)
           postorder(node.right)
           print(node.value)
  2. Методы обхода графика:

    • Поиск в глубину (DFS):

      def dfs(graph, start, visited=None):
       if visited is None:
           visited = set()
       visited.add(start)
       print(start)
       for neighbor in graph[start] - visited:
           dfs(graph, neighbor, visited)
    • Поиск в ширину (BFS):

      from collections import deque
      
      def bfs(graph, start):
       visited = set()
       queue = deque([start])
       visited.add(start)
       while queue:
           node = queue.popleft()
           print(node)
           for neighbor in graph[node] - visited:
               visited.add(neighbor)
               queue.append(neighbor)
  3. Операции с деревом:

    • Вставка:

      class TreeNode:
       def __init__(self, value):
           self.value = value
           self.left = None
           self.right = None
      
      def insert(root, value):
       if root is None:
           return TreeNode(value)
       if value < root.value:
           root.left = insert(root.left, value)
       else:
           root.right = insert(root.right, value)
       return root
    • Удаление:

      def delete(root, value):
       if root is None:
           return root
       if value < root.value:
           root.left = delete(root.left, value)
       elif value > root.value:
           root.right = delete(root.right, value)
       else:
           if root.left is None:
               return root.right
           elif root.right is None:
               return root.left
           root.value = find_min(root.right)
           root.right = delete(root.right, root.value)
       return root
      
      def find_min(node):
       while node.left is not None:
           node = node.left
       return node.value
  4. Операции с графиками:

    • Добавление преимущества:

      def add_edge(graph, u, v):
       graph[u].add(v)
       graph[v].add(u)
    • Удаление края:

      def remove_edge(graph, u, v):
       graph[u].remove(v)
       graph[v].remove(u)

Это всего лишь несколько примеров методов и операций для деревьев и графов. Существует множество других алгоритмов и методов, которые можно применять в зависимости от конкретного варианта использования.