Potrzebuję utworzyć strukturę drzewa podobną do dołączonego obrazu w Javie. Znalazłem kilka pytań związanych z tym, ale nie znalazłem przekonującej i dobrze wyjaśnionej odpowiedzi. Aplikacja składa się z suplementów diety (dania główne, desery i inne). Każda z tych kategorii może zawierać elementy nadrzędne lub elementy podrzędne i tak dalej.Implementacja drzewa w Javie (root, rodzice i dzieci)
Odpowiedz
import java.util.ArrayList;
import java.util.List;
public class Node<T> {
private List<Node<T>> children = new ArrayList<Node<T>>();
private Node<T> parent = null;
private T data = null;
public Node(T data) {
this.data = data;
}
public Node(T data, Node<T> parent) {
this.data = data;
this.parent = parent;
}
public List<Node<T>> getChildren() {
return children;
}
public void setParent(Node<T> parent) {
parent.addChild(this);
this.parent = parent;
}
public void addChild(T data) {
Node<T> child = new Node<T>(data);
child.setParent(this);
this.children.add(child);
}
public void addChild(Node<T> child) {
child.setParent(this);
this.children.add(child);
}
public T getData() {
return this.data;
}
public void setData(T data) {
this.data = data;
}
public boolean isRoot() {
return (this.parent == null);
}
public boolean isLeaf() {
if(this.children.size() == 0)
return true;
else
return false;
}
public void removeParent() {
this.parent = null;
}
}
Przykład:
import java.util.List;
Node<String> parentNode = new Node<String>("Parent");
Node<String> childNode1 = new Node<String>("Child 1", parentNode);
Node<String> childNode2 = new Node<String>("Child 2");
childNode2.setParent(parentNode);
Node<String> grandchildNode = new Node<String>("Grandchild of parentNode. Child of childNode1", childNode1);
List<Node<String>> childrenNodes = parentNode.getChildren();
Proces montażu węzłów drzewa jest podobny do procesu montażu list. Mamy konstruktor dla węzłów drzewa, który inicjuje zmienne instancji.
public Tree (Object cargo, Tree left, Tree right) {
this.cargo = cargo;
this.left = left;
this.right = right;
}
Mamy przeznaczyć węzły potomne pierwszy:
Tree left = new Tree (new Integer(2), null, null);
Tree right = new Tree (new Integer(3), null, null);
Możemy utworzyć węzeł nadrzędny i połączyć go z dziećmi w tym samym czasie:
Tree tree = new Tree (new Integer(1), left, right);
Powyższy rysunek nie jest binarne drzewo. –
To drzewo nie jest drzewo binarne, więc potrzebujesz tablicy elementów podrzędnych, takich jak List.
public Node(Object data, List<Node> children) {
this.data = data;
this.children = children;
}
Następnie utwórz instancje.
w przyjętym odpowiedź
public Node(T data, Node<T> parent) {
this.data = data;
this.parent = parent;
}
powinny być
public Node(T data, Node<T> parent) {
this.data = data;
this.setParent(parent);
}
inaczej rodzic nie posiada dziecko na liście dzieci
Proszę dodać jako komentarz – ytpillai
Accepted answer rzuca java.lang.StackOverflowError
podczas wywoływania metod setParent
lub addChild
.
Oto nieco prostsze wdrożenie bez tych błędów:
public class MyTreeNode<T>{
private T data = null;
private List<MyTreeNode> children = new ArrayList<>();
private MyTreeNode parent = null;
public MyTreeNode(T data) {
this.data = data;
}
public void addChild(MyTreeNode child) {
child.setParent(this);
this.children.add(child);
}
public void addChild(T data) {
MyTreeNode<T> newChild = new MyTreeNode<>(data);
newChild.setParent(this);
children.add(newChild);
}
public void addChildren(List<MyTreeNode> children) {
for(MyTreeNode t : children) {
t.setParent(this);
}
this.children.addAll(children);
}
public List<MyTreeNode> getChildren() {
return children;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
private void setParent(MyTreeNode parent) {
this.parent = parent;
}
public MyTreeNode getParent() {
return parent;
}
}
Kilka przykładów:
MyTreeNode<String> root = new MyTreeNode<>("Root");
MyTreeNode<String> child1 = new MyTreeNode<>("Child1");
child1.addChild("Grandchild1");
child1.addChild("Grandchild2");
MyTreeNode<String> child2 = new MyTreeNode<>("Child2");
child2.addChild("Grandchild3");
root.addChild(child1);
root.addChild(child2);
root.addChild("Child3");
root.addChildren(Arrays.asList(
new MyTreeNode<>("Child4"),
new MyTreeNode<>("Child5"),
new MyTreeNode<>("Child6")
));
for(MyTreeNode node : root.getChildren()) {
System.out.println(node.getData());
}
Oto moja implementacja w Java dla Państwa wymagań. W klasie treeNode użyłem ogólnej tablicy do przechowywania danych drzewa. możemy również użyć tablicy arraylist lub dynamicznej tablicy do zapisania wartości drzewa.
public class TreeNode<T> {
private T value = null;
private TreeNode[] childrens = new TreeNode[100];
private int childCount = 0;
TreeNode(T value) {
this.value = value;
}
public TreeNode addChild(T value) {
TreeNode newChild = new TreeNode(value, this);
childrens[childCount++] = newChild;
return newChild;
}
static void traverse(TreeNode obj) {
if (obj != null) {
for (int i = 0; i < obj.childCount; i++) {
System.out.println(obj.childrens[i].value);
traverse(obj.childrens[i]);
}
}
return;
}
void printTree(TreeNode obj) {
System.out.println(obj.value);
traverse(obj);
}
}
I klasa klienta dla powyższej implementacji.
public class Client {
public static void main(String[] args) {
TreeNode menu = new TreeNode("Menu");
TreeNode item = menu.addChild("Starter");
item = item.addChild("Veg");
item.addChild("Paneer Tikka");
item.addChild("Malai Paneer Tikka");
item = item.addChild("Non-veg");
item.addChild("Chicken Tikka");
item.addChild("Malai Chicken Tikka");
item = menu.addChild("Main Course");
item = item.addChild("Veg");
item.addChild("Mili Juli Sabzi");
item.addChild("Aloo Shimla Mirch");
item = item.addChild("Non-veg");
item.addChild("Chicken Do Pyaaza");
item.addChild("Chicken Chettinad");
item = menu.addChild("Desserts");
item = item.addChild("Cakes");
item.addChild("Black Forest");
item.addChild("Black Current");
item = item.addChild("Ice Creams");
item.addChild("chocolate");
item.addChild("Vanilla");
menu.printTree(menu);
}
}
WYJŚCIE
Menu
Starter
Veg
Paneer Tikka
Malai Paneer Tikka
Non-veg
Chicken Tikka
Malai Chicken Tikka
Main Course
Veg
Mili Juli Sabzi
Aloo Shimla Mirch
Non-veg
Chicken Do Pyaaza
Chicken Chettinad
Desserts
Cakes
Black Forest
Black Current
Ice Creams
chocolate
Vanilla
- 1. Implementacja java drzewa segmentowego
- 2. Implementacja drzewa binarnego drzewa javascript
- 3. Istniejąca implementacja drzewa Btree lub B + w Javie
- 4. Macierz hierarchiczna PHP - Rodzice i potomkowie
- 5. Mysql B + implementacja drzewa
- 6. Implementacja KDTree w Javie
- 7. Implementacja BGN w Javie
- 8. implementacja diff w Javie
- 9. Implementacja drzewa B w drzewie wyszukiwania
- 10. Implementacja koncepcji Przyjaciela w Javie
- 11. Dlaczego implementacja drzewa czerwono-czarnego dla drzewa JavaMap?
- 12. Język nawigacji drzewa obiektów w Javie
- 13. Obliczanie użycia pamięci drzewa B w Javie
- 14. Jak mogę nieskończenie dodawać dzieci do tego drzewa list?
- 15. Struktura danych drzewa NLTK, znajdowanie węzła, jego rodzica lub dzieci
- 16. PHP implementacja drzewa prefiks kontra tablicy doc
- 17. Implementacja drzewa binarnego przy użyciu Swift enum
- 18. Implementacja niestandardowego Spark RDD w Javie
- 19. Implementacja algorytmu A Star (A *) w Javie
- 20. Przejazd przez wszystkich węzłach binarnego drzewa w Javie
- 21. Jak parsować drzewa w nawiasie w pythonie?
- 22. Repository implementacja wzorca modelu danych w strukturze drzewa
- 23. jquery rodzice/najbliżsi nie pracujący
- 24. Czy istnieje implementacja drzewa wyszukiwania binarnego w .NET 4?
- 25. Dowolna implementacja R-drzewa w F # (lub C#)?
- 26. Co to jest proces kthreadd i dzieci i jak to się różni od init i dzieci
- 27. Uzyskiwanie dzieci dzieci w sitecore
- 28. Wyświetlanie drzewa w ASCII
- 29. XPath zwraca tylko elementy zawierające tekst, a nie jego rodzice
- 30. ANTLR4: Konstrukcja drzewa
to dobrze, czy masz przykłady, jak korzystać z funkcji drzewa? – ps0604
'Węzeł parentNode = new Node (" Parent "); \ r " –
Jonathan
' Węzeł parentNode = new Node ("Parent"); Węzeł childNode1 = new Node ("Child 1", parentNode); Węzeł childNode2 = new Node ("Child 2"); childNode2.setParent (parentNode); Węzeł grandchildNode = new Node ("Grandchild of parentNode, Child of childNode1", childNode1); Lista > childrenNodes = parentNode.getChildren(); ' –
Jonathan