Если вы делаете кодирование на доске, собеседование или даже просто планируете использовать дерево, многословия их немного.
Далее следует сказать, что причина, по которой дерево не существует, как, скажем, a Pair
(о котором можно сказать то же самое), заключается в том, что вы должны инкапсулировать свои данные в классе, используя его, и самая простая реализация выглядит следующим образом:
/***
/* 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;
}
Это действительно так для дерева произвольной ширины.
Если вам нужно двоичное дерево, его часто проще использовать с именованными полями:
private class Node { // Using package visibility is an option
String value;
Node left;
Node right;
}
Или, если вы хотели Trie:
private class Node {
String value;
Map<char, Node> nodes;
}
Теперь вы сказали, что хотите
чтобы иметь возможность получить все дочерние элементы (своего рода список или массив строк) по заданной входной строке, представляющей данный узел
Это звучит как твоя домашняя работа.
Но так как я достаточно уверен, что любой срок уже прошел ...
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()));
}
}
Это заставляет вас использовать как:
$ 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
[]