LARA

Insertion into a Tree with Parent Pointers

public final class Node {
   public /*: claimedby Tree */ Node left;
   public /*: claimedby Tree */ Node right;
   public /*: claimedby Tree */ Node parent;
   public /*: claimedby Tree */ int v;
}
 
public class Tree
{
   private static Node root;
 
   /*: public static specvar content :: objset;
       private vardefs "content == 
        {x. x ~= null & 
            (root,x) : {(x,y). x..left = y | x..right = y}^*}";
 
       invariant TreeInv: "tree [left, right]";
 
       invariant RootInv: "root = null | 
        (ALL n. n..left ~= root & n..right ~= root)";
 
       invariant ContentInv: 
        "ALL x. x ~: content & x ~= null --> 
              (x..left = null & x..right = null &
              (ALL y. y..left ~= x & y..right ~= x))";
 
       invariant ParentInv:
         "ALL x y. parent x = y -->
           ((x ~: content | x = root) --> y = null) &
 	   (x : content & x ~= root --> y ~= null &
           (y..left = x | y..right = x))";
   */
 
   public static void add(Node e)
      /*: 
	requires "e ~= null & e ~: content"
	modifies content
	ensures "content = old content Un {e}";
      */
   {
      Node n = root, p = null;
      boolean wentLeft = false;
      while /*: inv "((p = null & n = null) --> root = null) &
		     (p ~= null --> p : content) &
		     (n ~= null --> n : content) &
		     (p ~= null & wentLeft --> p..left = n) &
		     (p ~= null & ~wentLeft --> p..right = n)"
	     */
	  (n != null) {
	 p = n;
	 if (e.v < n.v) {
	    wentLeft = true;
            n = n.left;
	 } else {
	    wentLeft = false;
	    n = n.right;
	 }
      }
      if (p == null) {
	 root = e;
      } else {
	 e.parent = p;
	 if (wentLeft) {
            p.left = e;
	 } else {
            p.right = e;
	 }
      }
   }
}