package class6_2_BinarySearchTree_corrected; /** * Discovered bug in implementation of Node * * @param the type of the contained obects */ public class BinarySearchTree> { Node root; private class Node { Node left; Node right; E value; private Node(Node left, Node right, E value) { this.left = left; this.right = right; this.value = value; } } public void add(E e) { if(root == null) { root = new Node(null, null, e); } else { add(e, root); } } /** * @param e value to add * @param current the root of the sub-tree to add the node under * current != null */ private void add(E e, Node current) { if(e.compareTo(current.value) < 0 && current.left == null || e.compareTo(current.value) >=0 && current.right == null) { Node newNode = new Node(null, null, e); // System.out.println("DEBUG: Adding "+e+" to "+current.value); if(e.compareTo(current.value) < 0) { // System.out.println("DEBUG: Adding "+e+" to "+current.value+" on left"); current.left = newNode; } else { current.right = newNode; } } else { // EDIT: BUG-FIX: Accidentally double-nested the add. // Only require one comparision, as here. // System.out.println("DEBUG: Adding "+e+" to "+current.value+"'s child"); if(e.compareTo(current.value) < 0) { // e < current add(e, current.left); } else { add(e, current.right); } } } public void oldAdd(E e) { Node newNode = new Node(null, null, e); if(root == null) { root = newNode; } else { Node current = root; Node prev = null; while(current != null) { if(e.compareTo(current.value) < 0) { // e < current prev = current; current = current.left; } else { prev = current; current = current.right; } } if(e.compareTo(prev.value) < 0) { prev.left = newNode; } else { prev.right = newNode; } } } public void print() { printTree(root, 0); } private void printTree(Node current, int depth) { if(current != null) { printTree(current.left,depth+1); for(int i=0;i