Из вашего примера:
(add-node 6 (add-node 4 (add-node 5 (add-node 3 (empty)))))
должен производить
(node 3 (empty) (node 5 (leaf 4) (leaf 6)))
Это содержит много вызовов add-node
, и это делает его более запутанным. Поэтому, чтобы получить лучшее представление о том, что вы хотите, я начну с самого внутреннего вызова add-node
.
(add-node 3 (empty))
Из исходного кода в вашем вопросе, похоже, это должно привести к
(node 3 (empty) (empty))
Итак, теперь, заменяя самый внутренний вызов в вашем большом примере, он становится
(add-node 6 (add-node 4 (add-node 5 (node 3 (empty) (empty)))))
=
(node 3 (empty) (node 5 (leaf 4) (leaf 6)))
Теперь я должен выяснить, что должен делать следующий самый внутренний вызов.
(add-node 5 (node 3 (empty) (empty)))
В конечном выводе 3
остается на вершине, а 5
идет к правому узлу, поэтому я могу только догадываться, что этот вызов должен произвести
(node 3 (empty) (node 5 (empty) (empty)))
Теперь заменив этот вызов в более широком примере:
(add-node 6 (add-node 4 (node 3 (empty) (node 5 (empty) (empty)))))
=
(node 3 (empty) (node 5 (leaf 4) (leaf 6)))
Следующий внутренний вызов
(add-node 4 (node 3 (empty) (node 5 (empty) (empty))))
Теперь я не понимаю вашу логику c. В соответствии с шаблоном предыдущего примера, 4
должен go в самый правый узел, "правый правый". Но в этом примере кажется, что go в левой части правого узла «правый левый». Кажется, он не идет к ближайшему пустому узлу, который был бы чисто «левым», поэтому я не знаю, какой шаблон вы пытаетесь создать.
Пожалуйста, уточните свой вопрос и добавьте больше Подробности, если вы хотите получить лучший ответ.