Size: a a a

2020 June 30

c

codingteam@cjr in codingteam
sergevp
Devel29A> А вот подскажите какой ООП вей траверсить деревья?

В каком смысле ООП? То есть, может просто обычный рекурсивный обход подойдёт?
def obhod(node):
   if node is None: return
   do_something_with(node.value)
   obhod(node.left_child)
   obhod(node.right_child)
(последние 3 строки переставлять на своё усмотрение для получения разных видов обхода)
источник

D

Devel29A in codingteam
Ну, в прямом. Например, направления/шаги могут быть завернуты в Command паттерн, например. Сам обход можно с помощью стейт машины трекать
источник

D

Devel29A in codingteam
Или вот предлагали впилить Visitor
источник

D

Devel29A in codingteam
+ можно, допустим, каким-то унифицированным образом добавлять pre-/post- обработчики
источник

c

codingteam@cjr in codingteam
sergevp
А, не, я не фанат Master Programmer[1]. ☺ Как по мне, если код решает задачу, то чем он проще — тем лучше.

[1] https://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html
источник

D

Devel29A in codingteam
Да, тут в том и дело, что километровые простыни
источник

c

codingteam@cjr in codingteam
sergevp
Простыни для обхода? Даже обход через итератор, даже если нет обратного указателя на родителя, на плюсах укладывается строчек в 10, наверное...
источник

D

Devel29A in codingteam
Да, я как-то так и пишу, обычно :) Но тут авторство не мое
источник

D

Devel29A in codingteam
codingteam@cjr
sergevp
Devel29A> А вот подскажите какой ООП вей траверсить деревья?

В каком смысле ООП? То есть, может просто обычный рекурсивный обход подойдёт?
def obhod(node):
   if node is None: return
   do_something_with(node.value)
   obhod(node.left_child)
   obhod(node.right_child)
(последние 3 строки переставлять на своё усмотрение для получения разных видов обхода)
Ну, и да. У меня небинарные деревья
источник

t

ttldtor in codingteam
Devel29A
А вот подскажите какой ООП вей траверсить деревья?
источник

t

ttldtor in codingteam
источник

D

Devel29A in codingteam
Ага
источник

c

codingteam@cjr in codingteam
sergevp
Функция traverse() с лямбдой в качестве параметра. :)
источник

t

ttldtor in codingteam
codingteam@cjr
sergevp
Функция traverse() с лямбдой в качестве параметра. :)
ну такой себе OOP =)
источник

t

ttldtor in codingteam
ну и там не совсем лямбда, там несколько методов
источник

t

ttldtor in codingteam
препроцессинг, процессинг, постпроцессинг
источник

t

ttldtor in codingteam
есть ещё препроцессинг и постпроцессинг на входе и выходе из дерева
источник

t

ttldtor in codingteam
ну всякие "map-reduce"
источник

D

Devel29A in codingteam
Вот, да
источник

t

ttldtor in codingteam
в контексте C++:
можно запилить визитор, да. Можно параметризировать визитор стратегиями обхода дерева.
Также параметризировать обработчиками

Можно вынести из этого "визитора" наружу характеристики коллекции. То есть, это уже будет проксик, который позволит применять к нему begin, end и итерирование, что  позволит юзеру прямо в блоке for по коллекции делать что-то с элементами
источник