Как проверить, сбалансировано ли двоичное дерево в Python: рекурсивные и итеративные методы

Чтобы проверить сбалансированность двоичного дерева в Python, вы можете использовать несколько методов. Вот несколько подходов:

Метод 1: рекурсивный подход

  1. Определите функцию is_balanced, которая принимает в качестве входных данных корень двоичного дерева.
  2. Реализовать вспомогательную функцию height, которая вычисляет высоту двоичного дерева.
  3. В функции is_balancedрекурсивно проверьте, сбалансированы ли левое и правое поддерево, сравнивая их высоты.
  4. Если оба поддерева сбалансированы и абсолютная разница между их высотами не превышает 1, верните True.
  5. В противном случае верните False.

Вот пример реализации:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def is_balanced(root):
    if root is None:
        return True
    left_height = height(root.left)
    right_height = height(root.right)
    if abs(left_height - right_height) <= 1 and is_balanced(root.left) and is_balanced(root.right):
        return True
    return False
def height(node):
    if node is None:
        return 0
    return max(height(node.left), height(node.right)) + 1
# Example usage:
# root = TreeNode(1)
# root.left = TreeNode(2)
# root.right = TreeNode(3)
# root.left.left = TreeNode(4)
# root.left.right = TreeNode(5)
# print(is_balanced(root))

Метод 2: итеративный подход

  1. Определите функцию is_balanced, которая принимает в качестве входных данных корень двоичного дерева.
  2. Используйте стек или очередь для обхода дерева по уровням.
  3. Для каждого узла, встреченного во время обхода, вычислите высоту его левого и правого поддеревьев.
  4. Если абсолютная разница между высотами больше 1, верните False.
  5. Продолжайте обход, пока не будут обработаны все узлы.
  6. Если не обнаружено несбалансированного поддерева, верните True.

Вот пример реализации:

from collections import deque
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def is_balanced(root):
    if root is None:
        return True
    queue = deque()
    queue.append(root)
    while queue:
        node = queue.popleft()
        left_height = height(node.left)
        right_height = height(node.right)
        if abs(left_height - right_height) > 1:
            return False
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return True
def height(node):
    if node is None:
        return 0
    return max(height(node.left), height(node.right)) + 1
# Example usage:
# root = TreeNode(1)
# root.left = TreeNode(2)
# root.right = TreeNode(3)
# root.left.left = TreeNode(4)
# root.left.right = TreeNode(5)
# print(is_balanced(root))