Utilidade da passagem pré e pós ordem de árvores binárias

13

Isso pode ser muito ingênuo, mas eu estava pensando, é o contexto de árvores binárias (planas, ordenadas e equilibradas), de todos os tipos transversais:

  • pré-encomenda em profundidade
  • profundidade primeiro em ordem
  • primeira ordem de profundidade
  • largura primeiro

qual é a utilidade real dos pré e pós-pedido? Quero dizer, existe algum tipo e / ou configuração de árvore binária na qual a travessia pré e / ou pós-ordem daria uma (algumas) vantagem (s) sobre as outras duas?

AFAICS, existem certos tipos e configurações de árvores binárias para as quais a ordem e a largura da primeira podem oferecer uma certa vantagem:

  • para uma árvore binária balanceada, qualquer percurso em profundidade utilizará menos espaço de armazenamento de memória em comparação com a largura primeiro (por exemplo, para árvore binária balanceada de 6 ou 7 nós, a altura é 2; portanto, qualquer percurso em profundidade precisará armazenar no máximo 2 nós a qualquer momento, enquanto o último nível tiver 3 ou 4 nós; portanto, a travessia em largura primeiro precisará armazenar até 3 ou 4 nós em algum momento). Nesse caso, o uso da travessia em ordem usa a menor quantidade de memória e visita os nós em sua ordem natural.

  • para uma árvore binária não balanceada, se estiver próximo do pior cenário de inserção, percorrê-la em largura primeiro usaria menos memória em comparação com qualquer uma das travessias em profundidade. Portanto, neste caso, a amplitude oferece uma vantagem. A travessia em ordem tem novamente a vantagem de visitar valores em sua ordem natural.

No entanto, não consigo pensar em uma situação em que pré e pós-travessia dariam vantagem sobre os outros dois.

Shivan Dragon
fonte

Respostas:

13

Você precisa fazer várias coisas com árvores, como traduzir entre a estrutura de dados e alguma representação serial, como em um arquivo ou em um idioma.

Então, por exemplo, suponha que você tenha uma árvore de análise como esta:

    *
   / \
  +   \
 / \   \
A   B   C

Você pode serializá-lo como * + A B Ccaminhando na ordem do prefixo ou A B + C *caminhando na ordem do postfix. Se você trabalha com processadores de idiomas, essas coisas precisam ser de segunda natureza.

Mike Dunlavey
fonte
Muito bom exemplo! E observe como a travessia em ordem renderia A + B * C, que é muito mais fácil de entender para usuários normais do que qualquer prefixo da ordem do postfix.
Kilian Foth
3
@KilianFoth, exceto que não é isso que a árvore diz - ela diz (A + B) * C, pelo menos aos meus olhos. Embora meus dedos HP-28s gostem da versão AB + C *, tudo bem. :-)
sdg 11/02
@Kilian: SDG está certo. Na ordem, você precisa se preocupar com precedência, a menos que coloque parênteses em torno de tudo.
11133 Mike Dunlavey
13

O artigo da wikipedia possui uma boa descrição concisa de quando você deseja usar os diferentes tipos de pesquisa profunda:

  • Fazer a pré-ordenação da travessia ao duplicar nós e valores pode criar uma duplicata completa de uma árvore binária. Também pode ser usado para criar uma expressão de prefixo (notação polonesa) a partir de árvores de expressão: percorra a árvore de expressão em ordem prévia.
  • A travessia em ordem é muito comumente usada em árvores de pesquisa binária porque retorna valores do conjunto subjacente em ordem, de acordo com o comparador que configurou a árvore de pesquisa binária (daí o nome).
  • A travessia pós-ordem ao excluir ou liberar nós e valores pode excluir ou liberar uma árvore binária inteira. Também pode gerar uma representação postfix de uma árvore binária.

Tudo se resume às necessidades logísticas de um algoritmo. Por exemplo, se você não usar o percurso de pós-ordem durante a exclusão, perderá as referências necessárias para excluir as árvores filhas.

Karl Bielefeldt
fonte
A Wikipedia a partir de 10 de novembro de 2019 mudou e a primeira descrição também pertence ao Pós-Pedido, o que é confuso. Foi por isso que acabei aqui, procurando outra fonte de informação.
whoan
5

O objetivo de ter algoritmos diferentes para lidar com árvores binárias não é fazer coisas com árvores. Nesse nível abstrato, uma ordem é tão boa quanto qualquer outra, pois você só obtém símbolos abstratos do procedimento.

Mas as árvores geralmente são usadas para representar coisas interessantes, e isso pode fazer uma grande diferença no resultado. Por exemplo, se os nós representam estados de pesquisa em uma pesquisa completa em um grande domínio (talvez até um domínio infinito), a descida primeiro vs. o processamento primeiro não apenas determina em que ordem os resultados são encontrados, mas também pode determinar se você nunca encontre todas as soluções . O ponto é mais fácil de ver com domínios infinitos: se você descer sem cautela, poderá ignorar uma solução que fica bem no alto da árvore, simplesmente porque você tomou uma curva errada. Mas, na prática, como a memória e os discos também são finitos, isso se aplica a domínios simplesmente muito grandes, em vez de verdadeiramente infinitos.

Kilian Foth
fonte