Создайте функцию
traverse
, которая занимает первое из которых является дерево, второйempty_fn()
,leaf_fn(arg)
, третий являетсяnode_fn(arg0,arg1,arg2)
если дерево пусто функцияempty_fn()
которая принимает 0 аргументы должны были вызвать. Поэтому, если мы сталкиваемся с листом, нужно запуститьleaf_fn(arg)
, и если у нас есть поддерево, то должна быть запущена функцияnode_fn(arg0,arg1,arg2)
.Unsorted Двоичное деревья, Traversal, размерСоздайте функцию
contains_key
, которая вызываетtraverse()
и проверяет, существует ли ключ в данном двоичном дереве. Эта функция по существу предназначена для создания трех функций, используемых в качестве аргументов вtraverse
.Создайте новую функцию
tree_size()
, которая вызывает функциюtraverse()
и возвращает размер дерева.
Примечание: дерево не обязательно должны быть отсортированы в правильном пути, например [[3,5,4],1,0]
является допустимым дереву
Пример
def empty_fn():
return 0
def leaf_fn(key):
return key**2
def node_fn(key, left_value, right_value):
return key + left_value
>>> traverse([6, 7, 8], inner_node_fn, leaf_fn, empty_tree_fn)
43
Здесь - мои попытки решить проблему, учитывая t он образец программы работает с учетом спецификациями:
def traverse(tree,empty_tree_fn,leaf_fn, inner_node_fn):
if is_empty_tree(tree):
return empty_tree_fn()
else:
if is_leaf(tree[0]):
tree[0]=leaf_fn(tree[0])
elif is_leaf(tree[2]):
tree[2]=leaf_fn(tree[2])
return inner_node_fn(tree[1],tree[0],tree[2])
если я запустить его против ввода заданного на примере я получаю тот же результат, что означает, что это способ сделать это правильно? он тем не менее становится все более сложным, как только мы переходим ко второй части проблемы, как я мастерил, чтобы создать новую версию traverse()
namley traverse2_0
, чтобы соответствовать требованиям вопроса 1. Вот мой код:
def traverse2_0(tree,empty_tree_fn,leaf_fn, inner_node_fn):
if is_empty_tree(tree):
return empty_tree_fn()
else:
"""if is_leaf(tree[0]) and is_leaf(tree[2]):
return leaf_fn(tree[0]) or leaf_fn(tree[2])""" #lazy mechanism
if is_leaf(tree[0]):
if leaf_fn(tree[0]):
return True
if is_leaf(tree[2]):
if leaf_fn(tree[2]):
return True
else:
return inner_node_fn(tree[1],tree[0],tree[2])
return False
def contains_key(key, tree):
#print (tree)
def empty_fn(tree):
return not is_empty_tree(tree)
def leaf_fn(side):
return side==key
def inner_node_fn(k,left,right):
if isinstance(left,list) and isinstance(right,list):
return contains_key(key, left) or contains_key(key, right)
elif isinstance(left,list):
return contains_key(key,left)
elif isinstance(right,list):
return contains_key(key, right)
if key==tree[1]:
return True
else:
return traverse2_0(tree,empty_fn,leaf_fn,inner_node_fn)
И как только мы добраться до третьего еще сложнее, если я хочу использовать traverse()
, поэтому мне пришлось рекурсивно решать его. ОДНАКО ни одно из моих решений, кроме первого, не отвечает требованиям, заданным в соответствии с моими вопросами. Я чувствую, что нет способа удовлетворить все три требования, приведенные в примере.
def tree_size(tree):
if not tree: #corresponds to empty_tree_fn
return 0
if isinstance(tree[0],list): #corresponds to inner_node_fn
return tree_size(tree[0])+tree_size(tree[1:])
else:
return 1+tree_size(tree[1:]) #corresponds to leaf_fn
print (tree_size([[0,1,2],2,[1,3,2]]))
Это очень длинный вопрос, я знаю об этом и благодарен за любой ответ.
Единственный вопрос, который я нашел здесь, - это «... это способ сделать это правильно?» *, Что не является хорошим вопросом. Лучшие вопросы о переполнении стека - это довольно маленькие, * конкретные * вопросы, которые помогут будущим посетителям. Задавая такой вопрос, как «как Python обрабатывает функции как аргументы для других функций?» начался хорошо, но не исполнил титул. –
@ JonathonReinhart Поиск подходящего названия почти так же сложно, как и решение проблемы.Я знаю, что вопрос слишком длинный, и я чувствовал, что как функции python обрабатывать как аргументы является вводящим в заблуждение заголовком. И мой вопрос заключается в том, как создать единую функцию, отвечающую всем требованиям. У вас есть мои искренние извинения за путаницу. –