]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/collections/BinaryTree.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / collections / BinaryTree.js
diff --git a/static/dojo-release-1.1.1/dojox/collections/BinaryTree.js b/static/dojo-release-1.1.1/dojox/collections/BinaryTree.js
new file mode 100644 (file)
index 0000000..edd9fbf
--- /dev/null
@@ -0,0 +1,211 @@
+if(!dojo._hasResource["dojox.collections.BinaryTree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.BinaryTree"] = true;
+dojo.provide("dojox.collections.BinaryTree");
+dojo.require("dojox.collections._base");
+
+dojox.collections.BinaryTree=function(data){
+       function node(data, rnode, lnode){
+               this.value=data||null;
+               this.right=rnode||null;
+               this.left=lnode||null;
+               this.clone=function(){
+                       var c=new node();
+                       if(this.value.value){
+                               c.value=this.value.clone();
+                       }else{ 
+                               c.value=this.value;
+                       }
+                       if(this.left!=null){
+                               c.left=this.left.clone();
+                       }
+                       if(this.right!=null){
+                               c.right=this.right.clone();
+                       }
+                       return c;
+               }
+               this.compare=function(n){
+                       if(this.value>n.value){ return 1; }
+                       if(this.value<n.value){ return -1; }
+                       return 0;
+               }
+               this.compareData=function(d){
+                       if(this.value>d){ return 1; }
+                       if(this.value<d){ return -1; }
+                       return 0;
+               }
+       }
+
+       function inorderTraversalBuildup(current, a){
+               if(current){
+                       inorderTraversalBuildup(current.left, a);
+                       a.push(current.value);
+                       inorderTraversalBuildup(current.right, a);
+               }
+       }
+
+       function preorderTraversal(current, sep){
+               var s="";
+               if (current){
+                       s=current.value.toString() + sep;
+                       s+=preorderTraversal(current.left, sep);
+                       s+=preorderTraversal(current.right, sep);
+               }
+               return s;
+       }
+       function inorderTraversal(current, sep){
+               var s="";
+               if (current){
+                       s=inorderTraversal(current.left, sep);
+                       s+=current.value.toString() + sep;
+                       s+=inorderTraversal(current.right, sep);
+               }
+               return s;
+       }
+       function postorderTraversal(current, sep){
+               var s="";
+               if (current){
+                       s=postorderTraversal(current.left, sep);
+                       s+=postorderTraversal(current.right, sep);
+                       s+=current.value.toString() + sep;
+               }
+               return s;
+       }
+       
+       function searchHelper(current, data){
+               if(!current){ return null; }
+               var i=current.compareData(data);
+               if(i==0){ return current; }
+               if(i>0){ return searchHelper(current.left, data); }
+               else{ return searchHelper(current.right, data); }
+       }
+
+       this.add=function(data){
+               var n=new node(data);
+               var i;
+               var current=root;
+               var parent=null;
+               while(current){
+                       i=current.compare(n);
+                       if(i==0){ return; }
+                       parent=current;
+                       if(i>0){ current=current.left; }
+                       else{ current=current.right; }
+               }
+               this.count++;
+               if(!parent){
+                       root=n;
+               }else{
+                       i=parent.compare(n);
+                       if(i>0){ 
+                               parent.left=n;
+                       }else{
+                               parent.right=n;
+                       }
+               }
+       };
+       this.clear=function(){
+               root=null;
+               this.count=0;
+       };
+       this.clone=function(){
+               var c=new dojox.collections.BinaryTree();
+               var itr=this.getIterator();
+               while(!itr.atEnd()){
+                       c.add(itr.get());
+               }
+               return c;
+       };
+       this.contains=function(data){
+               return this.search(data) != null;
+       };
+       this.deleteData=function(data){
+               var current=root;
+               var parent=null;
+               var i=current.compareData(data);
+               while(i!=0&&current!=null){
+                       if(i>0){
+                               parent=current;
+                               current=current.left;
+                       }else if(i<0){
+                               parent=current;
+                               current=current.right;
+                       }
+                       i=current.compareData(data);
+               }
+               if(!current){ return; }
+               this.count--;
+               if(!current.right){
+                       if(!parent){ 
+                               root=current.left;
+                       }else{
+                               i=parent.compare(current);
+                               if(i>0){ parent.left=current.left; }
+                               else if(i<0){ parent.right=current.left; }
+                       }
+               } 
+               else if(!current.right.left){
+                       if(!parent){
+                               root=current.right;
+                       }else{
+                               i=parent.compare(current);
+                               if(i>0){ parent.left=current.right; }
+                               else if(i<0){ parent.right=current.right; }
+                       }
+               }
+               else{
+                       var leftmost=current.right.left;
+                       var lmParent=current.right;
+                       while(leftmost.left!=null){
+                               lmParent=leftmost;
+                               leftmost=leftmost.left;
+                       }
+                       lmParent.left=leftmost.right;
+                       leftmost.left=current.left;
+                       leftmost.right=current.right;
+                       if(!parent){ 
+                               root=leftmost;
+                       }else{
+                               i=parent.compare(current);
+                               if(i>0){ parent.left=leftmost; }
+                               else if(i<0){ parent.right=leftmost; }
+                       }
+               }
+       };
+       this.getIterator=function(){
+               var a=[];
+               inorderTraversalBuildup(root, a);
+               return new dojox.collections.Iterator(a);
+       };
+       this.search=function(data){
+               return searchHelper(root, data);
+       };
+       this.toString=function(order, sep){
+               if(!order){ order=dojox.collections.BinaryTree.TraversalMethods.Inorder; }
+               if(!sep){ sep=","; }
+               var s="";
+               switch(order){
+                       case dojox.collections.BinaryTree.TraversalMethods.Preorder:
+                               s=preorderTraversal(root, sep);
+                               break;
+                       case dojox.collections.BinaryTree.TraversalMethods.Inorder:
+                               s=inorderTraversal(root, sep);
+                               break;
+                       case dojox.collections.BinaryTree.TraversalMethods.Postorder:
+                               s=postorderTraversal(root, sep);
+                               break;
+               };
+               if(s.length==0){ return ""; }
+               else{ return s.substring(0, s.length - sep.length); }
+       };
+
+       this.count=0;
+       var root=this.root=null;
+       if(data){
+               this.add(data);
+       }
+}
+dojox.collections.BinaryTree.TraversalMethods={
+       Preorder: 1, Inorder: 2, Postorder: 3
+};
+
+}