#python #recursion #data-structures #binary-tree
Вопрос:
я столкнулся с этим вопросом, когда мне было поручено преобразовать кортеж в двоичное дерево, а затем преобразовать двоичное дерево обратно в кортеж и вернуть как дерево, так и кортеж. мне удалось преобразовать кортеж в дерево, но мне не удалось создать функцию для обратного. я всего лишь начинающий, пытающийся изучить структуры данных.
функция parse_tuple здесь используется для анализа кортежа для создания двоичного дерева, которое отлично работает.
пожалуйста, помогите мне исправить мою функцию tree_to_tuple. любые идеи или советы по исправлению логики были бы великолепны.
Спасибо
#used for creating binary tree class TreeNode: def __init__(self, key): self.key = key self.left = None self.right = None
#used to parse over the tuple to create a bianry tree def parse_tuple(data): if isinstance(data, tuple) and len(data) == 3: node = TreeNode(data[1]) node.left = parse_tuple(data[0]) node.right = parse_tuple(data[2]) elif data is None: node = None else: node = TreeNode(data) return node
#doesnt work def tree_to_tuple(node): if isinstance(node, TreeNode) and node.left is not None and node.right is not None: node_mid = node.key node_left = tree_to_tuple(node.left) node_right = tree_to_tuple(node.right) elif node.left is None: node_left = None else: node_right = None return (node_left, node_mid, node_right)
tree_tuple = ((1, 3, None), 2, ((None, 3, 4), 5, (6, 7, 8))) tree2 = parse_tuple(tree_tuple) tree_tuple2 = (1, 2, 3) tree = parse_tuple(tree_tuple2) print(tree_to_tuple(tree2))
и это ошибка, которую я получаю, если пытаюсь использовать tree_to_tuple
Файл «main.py», строка 45, в возврате tree_to_tuple (node_left, node_mid, node_right) UnboundLocalError: локальная переменная ‘node_left’, на которую ссылаются перед назначением.
Комментарии:
1. Ну, вы всегда возвращаетесь
(node_left, node_mid, node_right)
, но если вы прошли через ветвиelif
илиelse
ветви, то они не будут определены. Вelif
ветке вы только определяетеnode_left
и забываете о node_mid и node_right, а вelse
ветке вы определяете только node_right и забываете о node_mid и node_left.
Ответ №1:
Вы были близки, но ваши тесты немного запутаны.
Вот патч:
def tree_to_tuple(node): if isinstance(node, TreeNode): # special case if the tree has no left and no right sub-tree if node.left is None and node.right is None: return node.key return ( tree_to_tuple(node.left), node.key, tree_to_tuple(node.right) ) raise ValueError('this is not a tree') tree_tuple = ((1, 3, None), 2, ((None, 3, 4), 5, (6, 7, 8))) tree2 = parse_tuple(tree_tuple) tree_tuple2 = (1, 2, 3) tree = parse_tuple(tree_tuple2) print(tree_to_tuple(tree2))
Выход:
((1, 3, None), 2, ((None, 3, 4), 5, (6, 7, 8)))
Комментарии:
1. большое вам спасибо за это решение`. `
2. @ShivaKharbanda, не за что 🙂
Ответ №2:
Вот фрагмент кода, который я написал, который работает для меня.
def tree_to_tuple(node): if isinstance(node, TreeNode): if node.left is not None and node.right is not None: node_mid = node.key node_left = tree_to_tuple(node.left) node_right = tree_to_tuple(node.right) return (node_left, node_mid, node_right) elif node.left is None and node.right is None: return node.key elif node.left is None and node.right is not None: node_mid = node.key node_right = tree_to_tuple(node.right) node_left = None return (node_left, node_mid, node_right) elif node.left is not None and node.right is None: node_mid = node.key node_right = None node_left = tree_to_tuple(node.left) return (node_left, node_mid, node_right) else: print("It's not a tree")