Example #1
0
 /**
  * Clip nodes height above limit.
  *
  * @param tree to clip
  * @param limit height limit
  */
 private void limitNodes(MutableTree tree, double limit) {
   for (int i = 0; i < tree.getInternalNodeCount(); i++) {
     final NodeRef n = tree.getInternalNode(i);
     if (tree.getNodeHeight(n) > limit) {
       tree.setNodeHeight(n, limit);
     }
   }
   MutableTree.Utils.correctHeightsForTips(tree);
 }
Example #2
0
  /*

  1
  ├──── 2
  │     ├──── 3
  │     │     ├──── 4
  │     │     └──── 5
  │     └───── 6
  ├──── 7
  ├──── 8
  │     ├──── 9
  │     └──── 10
  └──── 11
  	  └──── 12
  			└──── 13
  				  └──── 14
  	 */
  @Nonnull
  static MutableTree<Integer> createMockTree() {
    final MutableTree<Integer> result = Trees.newLinkedTree(1);

    MutableTreeNode<Integer> root = result.getRoot();
    MutableTreeNode<Integer> child2 = root.addChild(2);
    MutableTreeNode<Integer> child3 = child2.addChild(3);
    child3.addChild(4);
    child3.addChild(5);
    child2.addChild(6);
    root.addChild(7);
    MutableTreeNode<Integer> child8 = root.addChild(8);
    child8.addChild(9);
    child8.addChild(10);
    root.addChild(11).addChild(12).addChild(13).addChild(14);

    return result;
  }
Example #3
0
  public void attemptToScaleTree(MutableTree tree, double rootHeight) {
    // avoid empty tree
    if (tree.getRoot() == null) return;

    double scale = rootHeight / tree.getNodeHeight(tree.getRoot());
    for (int i = 0; i < tree.getInternalNodeCount(); i++) {
      NodeRef n = tree.getInternalNode(i);
      tree.setNodeHeight(n, tree.getNodeHeight(n) * scale);
    }
    MutableTree.Utils.correctHeightsForTips(tree);
  }
Example #4
0
  @Test
  public void testRemoveNodeIf() throws Exception {
    // remove all even elements
    MutableTree<Integer> tree = createMockTree();
    tree.removeNodeIf(
        new JPredicate<TreeNode<Integer>>() {
          @Override
          public boolean apply(@Nullable TreeNode<Integer> input) {
            return input.getValue() % 2 == 0;
          }
        });

    Assert.assertEquals(3, tree.getSize());
    for (TreeNode<Integer> node : tree) {
      Assert.assertTrue(node.getValue() % 2 != 0);
    }

    // remove all elements
    tree = createMockTree();
    tree.removeNodeIf(
        new JPredicate<TreeNode<Integer>>() {
          @Override
          public boolean apply(@Nullable TreeNode<Integer> input) {
            return true;
          }
        });
    Assert.assertEquals(1, tree.getSize());

    // remove all odd elements
    tree = createMockTree();
    tree.removeNodeIf(
        new JPredicate<TreeNode<Integer>>() {
          @Override
          public boolean apply(@Nullable TreeNode<Integer> input) {
            return input.getValue() % 2 != 0;
          }
        });

    Assert.assertEquals(5, tree.getSize());
    for (TreeNode<Integer> node : tree) {
      if (node != tree.getRoot()) {
        Assert.assertTrue(node.getValue() % 2 == 0);
      }
    }
  }
Example #5
0
  public MutableTree sortedDelete(MutableTree root, int deleteVal) {
    if (root == null) return null;

    if (root.getValue() == deleteVal) { // wurzel soll geloescht werden
      if (root.getLeft() == null && root.getRight() == null) { // nur root
        // leeren baum zurueckgeben
        return null;
      } // else { //wurzel hat kinder
      // root = root.copy(); //ab hier brauchen wir eine kopie

      if (root.getRight() != null) { // rechter teilbaum vorhanden.
        MutableTree rightMin = (MutableTree) root.getRight().getMin();

        // root.value = rightMin.value; //kleinstes Element in die Wurzel kopieren
        // root.right = sortedDelete(root.right, rightMin.value); //und aus rechtem teilbaum
        // loeschen

        MutableTree newRoot = new DavidMutableTree(rightMin.getValue());
        newRoot.setLeft(root.getLeft());
        newRoot.setRight(sortedDelete(root.getRight(), rightMin.getValue()));
        return newRoot;
      } // else { //kein rechter teilbaum
      // root = root.left; //loeschen "wie in liste"
      return root.getLeft();
      // }
      // der sonderfall (right != null && left==null) wird nicht betrachtet
      // so spaart man sich ein paar vergleiche, einigen dublicate code
      // mit einem kleinen risiko etwas mehraufwand zu betreiben
      // }
    } // else { //wurzel wird nicht geloescht
    MutableTree newRoot = new DavidMutableTree(root.getValue()); // kopie anlegen
    if (deleteVal < root.getValue()) { // element zum loeschen ist links
      newRoot.setLeft(sortedDelete(root.getLeft(), deleteVal)); // element links loeschen
      newRoot.setRight(root.getRight()); // rechts bleibt unveraendert
      return newRoot;
    } // else { //analog mit rechts
    newRoot.setRight(sortedDelete(root.getRight(), deleteVal));
    newRoot.setLeft(root.getLeft());
    return newRoot;
    // }

    // root = newRoot; //alte referenz mit neuem baum ueberschreiben
    // }
    // no return here, to ensure no altered tree is returned
    // return root; //root, den "neuen baum", zurueckgeben.
  }