// CSE 143, winter 2012 // An BinarySearchTree object represents an entire binary search tree of ints. // class invariant: // left sub tree values are less than the root // right sub tree values are greater than the root public class BinarySearchTree { IntTreeNode overallRoot; // Constructs an empty binary tree public BinarySearchTree() { overallRoot = null; } // Constructs a binary tree with the given node as its root. public BinarySearchTree(IntTreeNode overallRoot) { this.overallRoot = overallRoot; } // Prints all elements of this tree in left to right order. public void print() { print(overallRoot); System.out.println(); } // Prints a portion of the overall tree private void print(IntTreeNode root) { // implicit base case: if null, do nothing if (root != null) { print(root.left); // print my left sub-tree System.out.print(root.data + " "); // print myself print(root.right); // print my right sub-tree } } // Returns true if the overall tree contains the given target value, // false otherwise public boolean contains(int target) { return contains(overallRoot, target); } // Returns true if a portion of the overall tree contains the given // target value, false otherwise. private boolean contains(IntTreeNode root, int target) { if (root == null) { return false; } else if (root.data == target) { return true; } else if (target < root.data) { return contains(root.left, target); } else { // if (target > root.data) return contains(root.right, target); } } // Adds the value to the tree such that sorted BST order is maintained public void add(int value) { overallRoot = add(overallRoot, value); } // Adds the value to the given subtree. Does not add duplicates. // A node's initial state is passed in and it modified // state is returned. This is the x = change(x) pattern and // it allows attaching new nodes to the tree. private IntTreeNode add(IntTreeNode root, int value) { if (root == null) { root = new IntTreeNode(value); } else if (value < root.data) { root.left = add(root.left, value); } else if (value > root.data) { root.right = add(root.right, value); } return root; } }