/** * Replaces the subtree of {@code tree} rooted at {@code subRoot} with a node representing that * subtree. * * @param tree the tree whose subtree is to be collapsed * @param subRoot the root of the subtree to be collapsed */ @SuppressWarnings({"unchecked", "rawtypes"}) public static MutableCTreeNetwork collapse(MutableCTreeNetwork tree, Object subRoot) { // get the subtree rooted at subRoot MutableCTreeNetwork subTree = TreeUtils.getSubTree(tree, subRoot); Optional parent = tree.predecessor(subRoot); if (parent.isPresent()) { // subRoot has a parent, so attach its parent to subTree in its place Object parentEdge = Iterables.getOnlyElement(tree.inEdges(subRoot)); // THERE CAN BE ONLY ONE tree.removeNode(subRoot); tree.addEdge(parent.get(), subTree, parentEdge); } else { // subRoot is the root of tree tree.removeNode(subRoot); tree.addNode(subTree); } return subTree; }
TreeNetworkBuilder.builder().expectedNodeCount(27).build(); tree.addNode("root");
TreeNetworkBuilder.builder().expectedNodeCount(27).build(); tree.addNode("root");
tree.addNode("A0"); tree.addEdge("A0", "B0", edgeId++); tree.addEdge("A0", "B1", edgeId++);
TreeNetworkBuilder.builder().expectedNodeCount(27).build(); tree.addNode("root");
TreeNetworkBuilder.builder().expectedNodeCount(27).build(); tree.addNode("root");