Implementar árvore em Java
- Implementar uma árvore usando o método de recursão
-
Crie uma árvore em Java usando o método genérico e
ArrayList
Neste tutorial, veremos duas maneiras de fazer uma estrutura em árvore em Java. Uma estrutura em árvore pode ser útil de várias maneiras, como criar um diretório de pastas e nomes de arquivos.
Implementar uma árvore usando o método de recursão
Neste exemplo, criamos uma árvore binária com no máximo dois filhos, um à esquerda e outro à direita. O nó raiz é o pai de todos os nós filhos. Cada nó armazena um valor. Abaixo, tomamos duas aulas; um é Node
que representa um nó na árvore e o outro é a classe JavaTree
que executa operações nos nós.
A classe Node
tem três variáveis, a primeira é o valor a ser armazenado no nó que é do tipo de dados int
. Em seguida, pegamos duas variáveis, para nós filhos left
e right
; ambas as variáveis são do tipo Node
. Fazemos um construtor da classe Node
e inicializamos o value
do parâmetro; as variáveis esquerda e direita são definidas como null
.
Na classe JavaTree
, pegamos uma variável do tipo Node
e a chamamos de root
. Em seguida, criamos um método traverseRecursionTree()
que recebe um Node
como parâmetro e, dentro do método, verificamos se o Node
é null
; se não for, então chamamos o método traverseRecursionTree()
dele mesmo e passamos a parte esquerda
de Node
. Depois disso, imprimimos o value
do Node
e chamamos novamente o método a partir dele próprio e passamos o Node
certo. O processo de chamar a função por si só é chamado de recursão.
No método main()
, criamos um objeto de javaTree
e, em seguida, inicializamos todas as variáveis como a raiz, o filho esquerdo da raiz e o filho direito. Também criamos um filho esquerdo do filho da raiz. Imprimimos a árvore inteira usando javaTree.root
que contém todos os filhos.
class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
left = null;
right = null;
}
}
public class JavaTree {
Node root;
public void traverseRecursionTree(Node node) {
if (node != null) {
traverseRecursionTree(node.left);
System.out.print(" " + node.value);
traverseRecursionTree(node.right);
}
}
public static void main(String[] args) {
JavaTree javaTree = new JavaTree();
javaTree.root = new Node(10);
javaTree.root.left = new Node(6);
javaTree.root.right = new Node(5);
javaTree.root.left.left = new Node(3);
System.out.print("Binary Tree: ");
javaTree.traverseRecursionTree(javaTree.root);
}
}
Produção:
Binary Tree: 3 6 10 5
Crie uma árvore em Java usando o método genérico e ArrayList
No método anterior, estávamos limitados a apenas um tipo de dados como o valor nos nós int
. Neste programa, usamos o método genérico que nos permite usar qualquer tipo de dados de nossa escolha. Temos uma classe Node<T>
, aqui <T>
diz que podemos usar qualquer tipo de dados como String. Na classe, declaramos três variáveis, primeiro é a root
que é do tipo T
, então temos parent
do tipo Node<T>
e finalmente uma ArrayList de Node<T>
nomeada como crianças.
No construtor de Node
, pegamos root
do tipo T
e configuramos para a variável de classe root
. Em seguida, inicializamos a ArrayList children
. Agora, para adicionar filhos no parent
, criamos uma função addChild()
que recebe um filho
do tipo T
. Na função addChild()
, criamos um objeto de Node<T>
- childNode
e definimos o contexto de seu pai como o contexto da classe atual usando a palavra-chave this
. Em seguida, pegamos a ArrayList children
, adicionamos childNode
e retornamos childNode
.
Temos vários métodos na classe Node<T>
que podemos usar para realizar operações como o método getRoot()
que retorna a root
, a função isRoot()
verifica se o nó atual é um root
. Criamos uma função getLevel()
que retorna o nível do nó na árvore. Por fim, substituímos um método toString()
para retornar a árvore inteira se ela não for nula.
Agora criamos a classe Javatree
que possui o método main()
. Criamos x
e y
de Node <>
na classe. Aqui, usamos String como o tipo. Em ambos os construtores, passamos a raiz de cada árvore. Imprimimos a root
usando getRoot()
e então criamos um objeto de Node<String>
chamado child1
e chamamos o método addChild()
usando o objeto x
, aqui passamos o valor de Filho1
como argumento. No bloco de child1
, criamos três filhos de child1
usando seu objeto e chamamos addChild()
.
Usamos o mesmo processo para criar outra árvore com o nome child2
.
import java.util.ArrayList;
class Node<T> {
private final T root;
private Node<T> parent;
private final ArrayList<Node<T>> children;
public Node(T root) {
this.root = root;
children = new ArrayList<>();
}
public Node<T> addChild(T child) {
Node<T> childNode = new Node<T>(child);
childNode.parent = this;
this.children.add(childNode);
return childNode;
}
public T getRoot() {
return root;
}
public boolean isRoot() {
return parent == null;
}
public boolean isLeaf() {
return children.size() == 0;
}
public int getLevel() {
if (this.isRoot())
return 0;
else
return parent.getLevel() + 1;
}
@Override
public String toString() {
return root != null ? root.toString() : "null";
}
}
public class JavaTree {
public static void main(String[] args) {
Node<String> x = new Node<String>("parent1");
Node<String> y = new Node<String>("parent2");
System.out.println(x.getRoot());
Node<String> child1 = x.addChild("child1");
{
Node<String> innerChild1 = child1.addChild("innerChild1OfChild1");
Node<String> innerChild2 = child1.addChild("innerChild2OfChild1");
Node<String> innerChild3 = child1.addChild("innerChild3OfChild1");
System.out.println("-" + child1);
System.out.println("--" + innerChild1);
System.out.println("--" + innerChild2);
System.out.println("--" + innerChild3);
System.out.println("Level of child1: " + child1.getLevel());
System.out.println("Level of innerChild2 in Child1: " + innerChild2.getLevel());
}
System.out.println();
System.out.println(y.getRoot());
Node<String> child2 = x.addChild("child2");
{
Node<String> innerChild1 = child2.addChild("innerChild2OfChild2");
Node<String> innerChild2 = child2.addChild("innerChild3OfChild2");
Node<String> innerChild3 = child2.addChild("innerChild4OfChild2");
{
Node<String> innerChild4 = innerChild3.addChild("innerChild4OfChild3");
System.out.println(innerChild4.getLevel());
System.out.println("\nIs inner Child4 Leaf? " + innerChild4.isLeaf());
}
System.out.println("-" + child2);
System.out.println("--" + innerChild1);
System.out.println("--" + innerChild2);
System.out.println("--" + innerChild3);
System.out.println("Level of child1: " + child2.getLevel());
System.out.println("Level of innerChild2 in Child2: " + innerChild2.getLevel());
}
}
}
Produção:
parent1
-child1
--innerChild1OfChild1
--innerChild2OfChild1
--innerChild3OfChild1
Level of child1: 1
Level of innerChild2 in Child1: 2
parent2
3
Is inner Child4 Leaf? true
-child2
--innerChild2OfChild2
--innerChild3OfChild2
--innerChild4OfChild2
Level of child1: 1
Level of innerChild2 in Child2: 2
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn