I have a small program that removes subtrees of a tree based on following condition: If a subtree consists only of nodes with "rank" 1, remove it. I am using recursive DFS approach. Trees or subtrees does not have any further special properties. I want to ask about your opinions. Is it possible to make this more elegant/more optimal?
public class Main {
public static void main(String[] args) {
List<Node> tree1 = Arrays.asList(
new Node(1, null, 1),
new Node(2, 1, 1),
new Node(3, 1, 1),
new Node(4, 2, 0),
new Node(5, 3, 1),
new Node(6, 5, 0),
new Node(7, 5, 1),
new Node(8, 7, 0),
new Node(9, 5, 1),
new Node(10, 3, 1)
);
List<Node> newTree = new ArrayList<>();
traverse(tree1.get(0), tree1, newTree);
if(tree1.get(0).rank != 1 || tree1.get(0).getNumberOfValidSubtrees() != 0) {
newTree.add(tree1.get(0));
}
System.out.println(tree1);
newTree.sort(Comparator.comparing(Node::getId));
System.out.println(newTree);
}
private static void traverse(Node parent, List<Node> allNodes, List<Node> newTree){
List<Node> children = allNodes.stream().filter(e -> e.parentId != null && e.parentId == parent.id).collect(Collectors.toList());
for(Node child : children) {
traverse(child, allNodes, newTree);
if(child.rank != 1 || child.getNumberOfValidSubtrees() != 0) {
parent.incrementValidSubtree();
newTree.add(child);
}
}
}
}
Node class
class Node{
int id;
Integer parentId;
int rank;
private int numberOfValidSubtrees;
Node(int id, Integer parentId, int rank){
this.id = id;
this.parentId = parentId;
this.rank = rank;
this.numberOfValidSubtrees = 0;
}
public int getNumberOfValidSubtrees(){
return this.numberOfValidSubtrees;
}
public void incrementValidSubtree() {
this.numberOfValidSubtrees++;
}
public int getId() {
return id;
}
public String toString() {
return String.valueOf(id);
}
}