Если вы делаете кодирование в доске, интервью или даже планируете использовать дерево, то многословие из них очень мало.
Следует также сказать, что причина, по которой дерево не существует, например, 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;
}
Или, если вы хотели синтаксического дерева:
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
[]
Если вы используете Java 8 и хотите пересечь ваши узлы потоками, фильтрацией и т. Д .; то вы можете взглянуть на Durian https://github.com/diffplug/durian/ –