// CSE 143, summer 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 SearchTree { private IntTreeNode overallRoot; // Constructs an empty binary tree public SearchTree() { overallRoot = null; } // Constructs a binary tree with the given node as its root. public SearchTree(IntTreeNode overallRoot) { this.overallRoot = overallRoot; } // Prints all elements of this tree in left to right order. public void print() { print(overallRoot); } // Prints a portion of the overall tree private void print (IntTreeNode root) { if (root != null) { // print left print(root.left); // prints data System.out.print (root.data + " "); // print right print(root.right); } } // Returns true if the overall tree contains the given target value, // false otherwise public boolean contains (int value) { return contains (overallRoot, value); } // Returns true if a portion of the overall tree contains the given // target value, false otherwise. private boolean contains (IntTreeNode node, int value) { if (node == null) { return false; } else if (node.data == value) { return true; } else if (value < node.data) { return contains (node.left, value); } else { return contains (node.right, value); } } // 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 node, int value) { if (node == null) { node = new IntTreeNode(value); } else if (value < node.data) { node.left = add (node.left, value); } else if (value > node.data) { node.right = add (node.right, value); } return node; } }