Чтобы проверить сбалансированность двоичного дерева в Python, вы можете использовать несколько методов. Вот несколько подходов:
Метод 1: рекурсивный подход
- Определите функцию
is_balanced, которая принимает в качестве входных данных корень двоичного дерева. - Реализовать вспомогательную функцию
height, которая вычисляет высоту двоичного дерева. - В функции
is_balancedрекурсивно проверьте, сбалансированы ли левое и правое поддерево, сравнивая их высоты. - Если оба поддерева сбалансированы и абсолютная разница между их высотами не превышает 1, верните True.
- В противном случае верните 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: итеративный подход
- Определите функцию
is_balanced, которая принимает в качестве входных данных корень двоичного дерева. - Используйте стек или очередь для обхода дерева по уровням.
- Для каждого узла, встреченного во время обхода, вычислите высоту его левого и правого поддеревьев.
- Если абсолютная разница между высотами больше 1, верните False.
- Продолжайте обход, пока не будут обработаны все узлы.
- Если не обнаружено несбалансированного поддерева, верните 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))