How to implement a tree data-structure in Java?

前端 未结 24 2929
鱼传尺愫
鱼传尺愫 2020-11-22 00:27

Is there any standard Java library class to represent a tree in Java?

Specifically I need to represent the following:

  • The sub-tree at any node can have
24条回答
  •  我在风中等你
    2020-11-22 00:55

    If you're doing whiteboard coding, an interview, or even just planning to use a tree, the verbosity of these is all a little much.

    It should further be said that the reason a tree is not in there like, say, a Pair (about which the same could be said), is because you should be encapsulating your data in the class using it, and the simplest implementation looks like:

    /***
    /* 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 nodes;
    }
    

    That's really it for an arbitrary width tree.

    If you wanted a binary tree it's often easier to use with named fields:

    private class Node { // Using package visibility is an option
      String value;
      Node left;
      Node right;
    }
    

    Or if you wanted a trie:

    private class Node {
      String value;
      Map nodes;
    }
    

    Now you said you want

    to be able to get all the children (some sort of list or array of Strings) given an input string representing a given node

    That sounds like your homework.
    But since I'm reasonably sure any deadline has now passed…

    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 list(Node node, String find) {
       return list(node, find, new ArrayList(), false);
     }
    
     static private ArrayList list(
         Node node,
         String find,
         ArrayList 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()));
     }
    }
    

    This gets you use like:

    $ 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
    []
    

提交回复
热议问题