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:
/***
/* Within the class that's using a binary tree for any reason. You could
/* generalize with generics IFF the parent class needs different value types.
*/
private class Node {
public String value;
public Node[] nodes; // Or an Iterable<Node> nodes;
}
É isso mesmo para uma árvore de largura arbitrária.
Se você queria uma árvore binária, geralmente é mais fácil usar com campos nomeados:
private class Node { // Using package visibility is an option
String value;
Node left;
Node right;
}
Ou se você quisesse um trie:
private class Node {
String value;
Map<char, Node> nodes;
}
Agora você disse que quer
ser capaz de obter todos os filhos (algum tipo de lista ou matriz de Strings) com uma string de entrada que representa um determinado nó
Isso soa como sua lição de casa.
Mas desde que eu tenho certeza que qualquer prazo já passou ...
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class kidsOfMatchTheseDays {
static private class Node {
String value;
Node[] nodes;
}
// Pre-order; you didn't specify.
static public List<String> list(Node node, String find) {
return list(node, find, new ArrayList<String>(), false);
}
static private ArrayList<String> list(
Node node,
String find,
ArrayList<String> list,
boolean add) {
if (node == null) {
return list;
}
if (node.value.equals(find)) {
add = true;
}
if (add) {
list.add(node.value);
}
if (node.nodes != null) {
for (Node child: node.nodes) {
list(child, find, list, add);
}
}
return list;
}
public static final void main(String... args) {
// Usually never have to do setup like this, so excuse the style
// And it could be cleaner by adding a constructor like:
// Node(String val, Node... children) {
// value = val;
// nodes = children;
// }
Node tree = new Node();
tree.value = "root";
Node[] n = {new Node(), new Node()};
tree.nodes = n;
tree.nodes[0].value = "leftish";
tree.nodes[1].value = "rightish-leafy";
Node[] nn = {new Node()};
tree.nodes[0].nodes = nn;
tree.nodes[0].nodes[0].value = "off-leftish-leaf";
// Enough setup
System.out.println(Arrays.toString(list(tree, args[0]).toArray()));
}
}
Isso faz você usar como:
$ java kidsOfMatchTheseDays leftish
[leftish, off-leftish-leaf]
$ java kidsOfMatchTheseDays root
[root, leftish, off-leftish-leaf, rightish-leafy]
$ java kidsOfMatchTheseDays rightish-leafy
[rightish-leafy]
$ java kidsOfMatchTheseDays a
[]