Другой способ проверить, является ли дерево зеркальным деревом, - найти пути к каждому узлу, а затем проверить, что все пути обращены:
class Tree:
def __init__(self, **kwargs):
self.__dict__ = {i:kwargs.get(i) for i in ['value', 'left', 'right']}
@staticmethod
def is_reversed(a, b):
return True if not a and not b else all(int(c) == (not int(d)) for c, d in zip(a, b))
def get_paths(self, path = ''):
yield [self.value, path]
yield from getattr(self.right, 'get_paths', lambda _:[])(path+'1')
yield from getattr(self.left, 'get_paths', lambda _:[])(path+'0')
t = Tree(value=31, left=Tree(value=16, left=Tree(value=7), right=Tree(value=24, right=Tree(value=29), left=Tree(value=19))), right=Tree(value=45))
t1 = Tree(value=31, right=Tree(value=16, right=Tree(value=7), left=Tree(value=24, right=Tree(value=19), left=Tree(value=29))), left=Tree(value=45))
"""
31 | 31
/ \ | / \
16 45 | 45 16
/ \ | / \
7 24 | 24 7
/ \ | / \
19 29 | 29 19
"""
_paths1 = dict(list(t.get_paths()))
_paths2 = dict(list(t1.get_paths()))
print(all(Tree.is_reversed(_paths1[i], _paths2[i]) for i in _paths1))
Вывод:
True