Introdução
Uma árvore em software é como uma árvore biológica, mas com as seguintes diferenças:
Os galhos da árvore de software são representados por linhas retas. Um bom exemplo de uma árvore de software que você pode ter usado é a árvore do diretório do disco rígido do seu computador.
Existem diferentes tipos de árvores. Há a árvore geral da qual outras árvores são derivadas. Outras árvores são derivadas pela introdução de restrições na árvore geral. Por exemplo, você pode querer uma árvore onde não mais de dois galhos emanam de um nó; Essa árvore seria chamada de árvore binária. Este artigo descreve a árvore em geral e como acessar todos os seus nós.
O hiperlink para baixar o código é fornecido na parte inferior deste artigo.
Para entender as amostras de código deste artigo, você precisa ter conhecimento básico em JavaScript (ECMAScript). Se você não tiver esse conhecimento, poderá obtê -lo de http: // www.Broad-Network.com/chrysanthusforcha-1/ecmascript-2015 Course.htm
O diagrama de árvore geral
'A' é o nó raiz; É o nó de primeiro nível. B, C, D estão na segunda linha; Estes são nós de segundo nível. E, f, g, h, i, j, k estão na terceira linha e eles são nós de terceiro nível. Uma quarta linha teria produzido nós de quarto nível e assim por diante.
Propriedades das árvores
- Todos os ramos de todos os níveis de nós, têm uma fonte, que é o nó raiz.
- Uma árvore possui n - 1 galhos, onde n é o número total de nós. O diagrama acima para a árvore em geral tem 11 nós e 10 galhos.
- Ao contrário dos humanos, onde toda criança tem dois pais, com a árvore de software, toda criança tem apenas um pai. O nó raiz é o maior pai ancestral. Um pai pode ter mais de um filho. Todo nó, exceto o nó raiz, é uma criança.
Vocabulário de árvore
Atravessando todos os nós de uma árvore
Todos os nós de uma árvore podem ser acessados para ler ou alterar qualquer valor do nó. No entanto, isso não é feito arbitrariamente. Existem três maneiras de fazer isso, tudo isso envolve a primeira travessia da profundidade da seguinte maneira:
1) na ordem: Simplificando, nesse esquema, a subárvore esquerda é atravessada primeiro; Em seguida, o nó raiz é acessado; Então, a subárvore direita é atravessada. Este esquema é simbolizado como esquerda-> root-> direita. A Fig 1 é re-exibida aqui para facilitar a referência:
Assumindo que existem dois irmãos por nó; Então esquerda-> raiz-> direito significa, você acessa o nó mais baixo e esquerdo primeiro, depois o pai do nó e depois o irmão direito. Quando houver mais de dois irmãos, tome o primeiro como a esquerda e o restante dos nós certos, como o direito. Para a árvore geral acima, a subárvore inferior esquerda é acessada para ter, [ebf]. Esta é uma subárvore. O pai desta subárvore é A; Então, a é acessado em seguida para ter [ebf] a. Em seguida, a subárvore [GCHI] é acessada para ter uma subárvore maior, [[ebf] a [gchi]]. Você pode ver a esquerda-> root-> perfil direito se retratando. Esta grande subárvore esquerda terá a subárvore, [JDK] à sua direita de completar o atravessamento para obter, [[ebf] a [gchi]] [jdk].
2) Pré-encomenda: Simplificando, nesse esquema, o nó raiz é acessado primeiro, depois a subárvore esquerda será atravessada a seguir, e então a subárvore direita é atravessada. Este esquema é simbolizado como raiz-> esquerda-> direita. A Fig 1 é re-exibida aqui para facilitar a referência.
Assumindo que existem dois irmãos por nó; Então raiz-> esquerda-> à direita significa, você acessa a raiz primeiro, depois a criança imediata esquerda e depois a criança imediata direita. Quando houver mais de dois irmãos, tome o primeiro como a esquerda e o restante dos nós certos, como o direito. O filho mais à esquerda do filho esquerdo é o próximo a ser acessado. Para a árvore geral acima, a subárvore raiz é [ABCD]. À esquerda desta subárvore, você tem a subárvore, [EF], dando a sequência de acesso, [ABCD] [EF]. À direita desta subárvore maior, você tem duas subáridas, [GHI] e [JK], dando a sequência completa, [ABCD] [ef] [ghi] [JK]. Você pode ver a raiz-> esquerda-> perfil certo retratando-se.
3) pós-ordem: Simplificando, nesse esquema, a subárvore esquerda é atravessada primeiro, depois a subárvore direita é atravessada e, em seguida, a raiz é acessada. Este esquema é simbolizado como esquerda-> direita-> raiz. A Fig 1 é re-exibida aqui para facilitar a referência.
Para esta árvore, as subáridas são, [efb], [ghic], [jkd] e [a] que formam a sequência, [efb], [ghic], [jkd] [a]. Você pode ver a esquerda-> direita-> perfil de raiz retratando-se.
Criando a árvore
A árvore acima será criada usando o ECMAScript, que é como a versão mais recente do JavaScript. Cada nó é uma matriz. O primeiro elemento de cada matriz de nó é o pai do nó, outra matriz. O restante dos elementos do nó são os filhos do nó, começando da criança mais à esquerda. Existe um mapa Ecmascript que relaciona cada matriz à sua string correspondente (letra). O primeiro segmento de código é:
No ECMAScript, você pode acessar uma função que é definida mais abaixo no programa. No entanto, com variáveis, você não pode fazer isso. Você não pode acessar uma variável que é definida mais abaixo no programa. Esta é a razão pela qual as variáveis acima foram desenvolvidas como mostrado.
Além disso, observe que acima do nó raiz A, há outro nó o (não zero). O primeiro elemento desta matriz (nó) é indefinido, o que significa que seu próprio pai é indefinido. O nó extra O foi adicionado para facilitar o código de travessia.
Há também um mapa. O mapa relaciona cada matriz de nomes de uma letra, com o nome da string correspondente de uma letra.
Função recursiva
Para acessar todos os elementos de uma árvore, você precisa de uma função recursiva. Uma função recursiva é uma função que continua se chamando até que uma condição seja cumprida.
Visitar um nó não significa necessariamente acessar o nó. Para acessar um nó, significa que seu valor é lido ou alterado. Nas amostras de código deste artigo, acessar um nó significa ler e exibir o valor (chave) do nó. Nas amostras de código, um nó pode ser visitado mais de uma vez, mas seu valor é acessado apenas uma vez.
Algoritmo e programação
Há um programa para cada uma das três técnicas de travessia.
Algoritmo e programação na ordem
Aqui, o nó mais baixo e mais esquerdo é visitado primeiro. As subáridas [ebf], [[ebf] a [gchi]] e [jdk] são desenvolvidas para dar a sequência completa, [[ebf] a [gchi]] [jdk].
Existem duas funções recursivas para este programa, onde cada um chama o outro. O principal é chamado fn (nó). O programa (código) é curto. Baixe o arquivo combinado abaixo para a codificação de detalhes.
Os três programas têm a mesma configuração de árvore de matriz (nó).
Algoritmo de pré-encomenda e programação
Aqui, há apenas uma função recursiva. É chamado, fn (nó). Aqui, as subáridas [ABCD], [EF], [GHI] e [JK] são desenvolvidas para dar a sequência completa, [ABCD] [EF] [GHI] [JK]. O programa para isso também é curto.
Os três programas têm a mesma configuração de árvore de matriz (nó).
Algoritmo e programação de pós-ordem
Aqui, o nó mais baixo e mais esquerdo é visitado primeiro. O [EFB], [GHIC], [JKD] e [A] subárvores são desenvolvidos para dar a sequência completa, [EFB], [GHIC], [JKD] [A] .
Existem duas funções recursivas para este programa, onde cada um chama o outro. O principal é chamado fn (nó). O programa para isso também é curto. Baixe o arquivo combinado abaixo para a codificação detalhada.
Os três programas têm a mesma configuração de árvore de matriz (nó).
Tipos de árvores
As árvores de programação de computadores são, de fato, estruturas de dados não lineares. As estruturas de dados lineares são listas, matrizes, pilhas, filas, pilhas, etc. Uma árvore com n nós tem galhos n-1. Quando o número de ramificações é igual ou maior que o número de nós, um gráfico é obtido. Um gráfico não é realmente uma árvore.
Existem árvores de software, que descrevem layouts, como a árvore do diretório no disco rígido de um computador. Muitas árvores não descrevem os layouts existentes. De fato, eles descrevem algoritmos. Por exemplo, o algoritmo matemático (x + y) x (x -y) é descrito por uma árvore onde x é o nó raiz, então + e - são nós filhos imediatos da raiz. X e Y são nós para crianças de +. X e Y são novamente os nós de crianças de -. Essa árvore é conhecida como uma árvore de expressão.
Muitos tipos diferentes de árvores podem ser categorizados em diferentes títulos; como árvore binária, árvore B, árvore de expressão, etc. Todos eles são derivados da árvore geral.
Algumas das categorias de árvores são divididas em outras categorias. A árvore binária, por exemplo, tem pelo menos a árvore de busca binária, a árvore AVL e a árvore cartesiana.
Baixando
Três programas foram fornecidos para este artigo. Existe um programa para a técnica em ordem (algoritmo), outra para a técnica de pré-encomenda, e mais uma para a técnica de pós-ordem. Todos eles foram colocados em um arquivo zip, chamado de travessia. O arquivo zip pode ser baixado em: github.
Conclusão
Uma árvore de software é como uma árvore normal no parque ou na floresta. No entanto, a árvore de programação de computador está de cabeça para baixo. Existem diferentes tipos de árvores. Outras árvores são derivadas pela introdução de restrições na árvore geral. Todos os nós de uma árvore podem ser acessados usando um algoritmo de encomenda, pré-encomenda ou pós-ordem. Uma árvore de software pode ser produzida por qualquer linguagem de computador. O ECMAScript foi escolhido aqui porque é a linguagem do computador mais simples. O próximo tipo de árvore que você deve estudar é a árvore binária, pois é a estrutura de dados de árvores mais popular.