Search code examples
javatreetraversal

How can I do a post-order traversal of a tree, when the only function I have is getChildren()?


I'm trying to collect all nodes in specific post-order traversal order. However, I'm not quite sure how to do this when my only function is getChildren(), rather than a left or right child. Here is the traversal I currently have, in Java.

Set<Node> postOrderedNodes = traverseSubAssembly(rootNode);

private static Set<Node> traverseSubAssembly(Node node) {

        Set<Node> nodes = new HashSet<>();

        nodes.add(node);

        for (Node child : node.getChildren()) {
            nodes.addAll(traverseSubAssembly(child));
        }

        return nodes;
    }

Solution

  • Set<Node> postOrderedNodes = traverseSubAssembly(rootNode);
    
    private static Set<Node> traverseSubAssembly(Node node) {
        Set<Node> nodes = new HashSet<>();
    
        for (Node child : node.getChildren()) {
            nodes.addAll(traverseSubAssembly(child));
        }
    
        nodes.add(node);  
        // Add the node after its children have been processed not before.
    
        return nodes;
    }
    

    To get exact Order:

    And also one more thing if you need to maintain insertion order of nodes U can use LinkedHashSet since hashSet does not maintain.