Existe alguma classe de biblioteca Java padrão para representar uma árvore em Java?
Especificamente, preciso representar o seguinte:
- A subárvore em qualquer nó pode ter um número arbitrário de filhos
- Cada nó (após a raiz) e seus filhos terão valor de sequência
- Eu preciso obter todos os filhos (algum tipo de lista ou matriz de Strings) de um determinado nó e seu valor de string (ou seja, um método que terá um nó como entrada e retornará todos os valores de string do nó filho como saída)
Existe alguma estrutura disponível para isso ou preciso criar minha própria (se houver, sugestões de implementação seriam ótimas).
java
data-structures
tree
ikl
fonte
fonte
Respostas:
Aqui:
Essa é uma estrutura de árvore básica que pode ser usada para
String
ou qualquer outro objeto. É bastante fácil implementar árvores simples para fazer o que você precisa.Tudo que você precisa adicionar são métodos para adicionar, remover, atravessar e construtores. O
Node
é o bloco de construção básico doTree
.fonte
Tree
classe não é necessária, porque cada umaNode
pode ser vista como uma árvore.Ainda outra estrutura de árvore:
Uso da amostra:
BÔNUS
Veja a árvore de pleno direito com:
https://github.com/gt4dev/yet-another-tree-structure
fonte
hasNext()
antes de cada chamadanext()
para obter resultados válidos. Isso não faz parte daIterator
especificação.Na verdade, existe uma estrutura de árvore muito boa implementada no JDK.
Dê uma olhada em javax.swing.tree , TreeModel e TreeNode . Eles foram projetados para serem usados com o
JTreePanel
mas são, de fato, uma implementação de árvore muito boa e não há nada que o impeça de usá-lo sem uma interface swing.Observe que no Java 9 você pode não usar essas classes, pois elas não estarão presentes nos 'Perfis compactos' .
fonte
Que tal isso?
fonte
setAsParent
ougetHead
fazem, e é nesse momento que eu realmente posso obter ajuda nas estruturas de dados da árvore. Até a fonte original do documento não possui comentários.Eu escrevi uma pequena biblioteca que lida com árvores genéricas. É muito mais leve que o material do balanço. Eu também tenho um projeto para mim .
fonte
Obviamente, você pode adicionar métodos utilitários para adicionar / remover filhos.
fonte
Você deve começar definindo o que é uma árvore (para o domínio); isso é melhor feito definindo a interface primeiro. Nem todas as estruturas de árvores são modificáveis, sendo possível adicionar e remover nós deve ser um recurso opcional, por isso criamos uma interface extra para isso.
Não há necessidade de criar objetos de nó que contenham os valores ; na verdade, eu vejo isso como uma grande falha de design e sobrecarga na maioria das implementações em árvore. Se você olhar para o Swing, ele
TreeModel
está livre de classes de nós (somenteDefaultTreeModel
é utilizadoTreeNode
), pois elas não são realmente necessárias.Estrutura em árvore mutável (permite adicionar e remover nós):
Dadas essas interfaces, o código que usa árvores não precisa se preocupar muito com a maneira como a árvore é implementada. Isso permite usar implementações genéricas e especializadas , nas quais você realiza a árvore delegando funções a outra API.
Exemplo: estrutura da árvore de arquivos
Exemplo: estrutura em árvore genérica (com base nas relações pai / filho):
fonte
Nenhuma resposta menciona código simplificado, mas funcionando demais, então aqui está:
fonte
Você pode usar qualquer API XML de Java como documento e nó .. como XML é uma estrutura de árvore com Strings
fonte
Se você estiver fazendo codificação do quadro branco, uma entrevista ou apenas planejando usar uma árvore, a verbosidade delas é um pouco demais.
Além disso, deve-se dizer que a razão pela qual uma árvore não está lá como, digamos, a
Pair
(sobre a qual o mesmo poderia ser dito), é porque você deve encapsular seus dados na classe que a usa, e a implementação mais simples se parece com:É isso mesmo para uma árvore de largura arbitrária.
Se você queria uma árvore binária, geralmente é mais fácil usar com campos nomeados:
Ou se você quisesse um trie:
Agora você disse que quer
Isso soa como sua lição de casa.
Mas desde que eu tenho certeza que qualquer prazo já passou ...
Isso faz você usar como:
fonte
Na mesma linha da resposta de Gareth, confira DefaultMutableTreeNode . Não é genérico, mas de outra forma parece se encaixar na conta. Mesmo que esteja no pacote javax.swing, não depende de nenhuma classe AWT ou Swing. De fato, o código fonte realmente tem o comentário
// ISSUE: this class depends on nothing in AWT -- move to java.util?
fonte
Existem algumas estruturas de dados de árvore em Java, como DefaultMutableTreeNode no JDK Swing, pacote de analisador de árvore no Stanford e outros códigos de brinquedo. Mas nenhum deles é suficiente, mas pequeno o suficiente para fins gerais.
O projeto da árvore Java tenta fornecer outra estrutura de dados em árvore de uso geral em Java. A diferença entre este e outros são
fonte
Como a pergunta solicita uma estrutura de dados disponível, uma árvore pode ser construída a partir de listas ou matrizes:
instanceof
pode ser usado para determinar se um elemento é uma subárvore ou um nó terminal.fonte
Object
s seriam os objetos de folha (por exemplo,String
s) ou ramos (representados por matrizes). E funciona: esse código será compilado e cria uma pequena árvore deString
s.Tão simples quanto possível e muito fácil de usar. Para usá-lo, estenda-o:
fonte
Por exemplo :
fonte
No passado, acabei de usar um mapa aninhado para isso. É isso que eu uso hoje, é muito simples, mas atende às minhas necessidades. Talvez isso ajude outro.
fonte
Eu escrevi uma pequena classe "TreeMap" baseada em "HashMap" que suporta a adição de caminhos:
Pode ser usado para armazenar uma Árvore de coisas do tipo "T" (genérico), mas ainda não suporta o armazenamento de dados extras em seus nós. Se você possui um arquivo como este:
Então você pode torná-lo uma árvore executando:
E você receberá uma bela árvore. Deve ser fácil se adaptar às suas necessidades.
fonte
Você pode usar a classe HashTree incluída no Apache JMeter que faz parte do Projeto Jakarta.
A classe HashTree está incluída no pacote org.apache.jorphan.collections. Embora este pacote não seja lançado fora do projeto JMeter, você pode obtê-lo facilmente:
1) Faça o download das fontes JMeter .
2) Crie um novo pacote.
3) Copie nele / src / jorphan / org / apache / jorphan / collections /. Todos os arquivos, exceto Data.java
4) Copie também /src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
5) O HashTree está pronto para uso.
fonte
Não existe uma estrutura de dados específica em Java que atenda aos seus requisitos. Seus requisitos são bastante específicos e, para isso, é necessário projetar sua própria estrutura de dados. Analisando seus requisitos, qualquer pessoa pode dizer que você precisa de algum tipo de árvore n-ária com alguma funcionalidade específica. Você pode projetar sua estrutura de dados da seguinte maneira:
Eu sugeriria que você escrevesse a estrutura do nó em uma classe como Class Node {String value; Listar children;} e todos os outros métodos, como search, insert e getChildren em outra classe NodeUtils, para que você também possa passar a raiz da árvore para executar operações em uma árvore específica, como: class NodeUtils {public static Node search (Node root, String value) {// execute o BFS e retorne o nó}
fonte
fonte
Eu escrevi uma biblioteca em árvore que funciona bem com o Java8 e que não tem outras dependências. Ele também fornece uma interpretação livre de algumas idéias da programação funcional e permite mapear / filtrar / remover / pesquisar a árvore ou subárvores inteiras.
https://github.com/RutledgePaulV/prune
A implementação não faz nada de especial na indexação e eu não me afastei da recursão; portanto, é possível que, com árvores grandes, o desempenho diminua e você possa explodir a pilha. Mas se tudo o que você precisa é de uma árvore simples, de profundidade pequena a moderada, acho que funciona bem o suficiente. Ele fornece uma definição sadia (baseada em valor) de igualdade e também possui uma implementação toString que permite visualizar a árvore!
fonte
Por favor, verifique o código abaixo, onde usei estruturas de dados em árvore, sem usar as classes Collection. O código pode ter bugs / aprimoramentos, mas use isso apenas para referência
fonte
Você pode usar a classe TreeSet em java.util. *. Está funcionando como uma árvore de pesquisa binária, portanto já está classificada. A classe TreeSet implementa as interfaces Iterable, Collection e Set. Você pode percorrer a árvore com o iterador como um conjunto.
Você pode verificar, Java Doc e outros .
fonte
Implementar Árvore Personalizada da Árvore sem usar a estrutura Coleção. Ele contém diferentes operações fundamentais necessárias na implementação da Árvore.
fonte