Чтобы проверить, что все узлы в дереве содержат ноль, вам придется зацикливаться на каждом из этих узлов.Можно создать метод __iter__
, чтобы найти все узлы в дереве, а затем можно применить встроенную функцию any
, чтобы определить, все ли они равны нулю.Наконец, простой рекурсивный метод может проверять левый и правый дочерние элементы и при необходимости удалять.
Для простоты создания дерева kwargs
используется для построения структуры на месте без реализации метода поворота илидлинная последовательность операторов присваивания:
class Tree:
def __init__(self, **kwargs):
self.__dict__ = {i:kwargs.get(i) for i in ['left', 'right', 'val']}
def __iter__(self):
yield self.val
yield from ([] if self.left is None else self.left)
yield from ([] if self.right is None else self.right)
@staticmethod
def remove_empty_trees(_t):
if not any(_t):
return None
_t.remove_trees()
return _t
def remove_trees(self):
if not any([] if self.left is None else self.left):
self.left = None
else:
self.left.remove_trees()
if not any([] if self.right is None else self.right):
self.right = None
else:
self.right.remove_trees()
# 4
# / \
# 1 3
# / \ / \
# 0 0 4 6
# /\ /\
# 3 5 0 0
t = Tree(val=4, left=Tree(val=1, left=Tree(val=0, left=Tree(val=3), right=Tree(val=5)), right=Tree(val=0, left=Tree(val=0), right=Tree(val=0))), right=Tree(val=3, left=Tree(val=4), right=Tree(val=6)))
new_tree = Tree.remove_empty_trees(t)
print(print(new_tree.left.right))
Вывод:
None
Для обработки случая, когда все дерево содержит нулевые узлы, staticmethod
обеспечивает дополнительную проверку.