Java中的树实现(root,父级和子级)

Car*_*los 28 java tree structure

我需要创建一个类似于Java中附加图像的树结构.我发现了一些与此相关的问题,但我没有找到令人信服且解释清楚的答案.应用程序业务包括食品超级类别(主菜,甜点和其他).这些类别中的每一个都可以包含父项或子项等.

期望的树结构

Jon*_*han 40

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() {
        return this.children.size == 0;
    }

    public void removeParent() {
        this.parent = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

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();
Run Code Online (Sandbox Code Playgroud)

  • java.lang.StackOverflowError的在tree.Node.addChild(Node.java:40)在tree.Node.setParent(Node.java:29)在tree.Node.addChild(Node.java:40)在tree.Node.setParent (Node.java:29)在tree.Node.addChild(Node.java:40)在tree.Node.setParent(Node.java:29)在tree.Node.addChild(Node.java:40)在tree.Node .setParent(Node.java:29)在tree.Node.addChild(Node.java:40)在tree.Node.setParent(Node.java:29)在tree.Node.addChild(Node.java:40)在树.Node.setParent(Node.java:29) (15认同)
  • 应该有`equals`和`hashCode`方法吗? (3认同)
  • 这段代码仍然抛出 StackOverflowError 真的很奇怪 (3认同)
  • `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>("parentNode的孙子.childNode1的子节点",childNode1); List <Node <String >> childrenNodes = parentNode.getChildren();` (2认同)

Esd*_*pez 26

java.lang.StackOverflowError调用setParentaddChild方法时接受的答案会抛出一个.

这是一个稍微简单的实现,没有这些错误:

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);
        this.addChild(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一些例子:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 该设计受到循环依赖和可变性的影响。如果需要,可以通过取消父节点并将其放在单独的节点映射中来解决。 (3认同)

Irs*_* ck 5

这是我用java实现的,以满足您的要求。在 treeNode 类中,我使用通用数组来存储树数据。我们还可以使用数组列表动态数组来存储树值。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以及上述实现的客户端类。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

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           
Run Code Online (Sandbox Code Playgroud)