import java.util.*; public class ThreadedTree> { private ThreadedTreeNode root; private ThreadedTreeNode trailer; private ThreadedTreeNode current; public ThreadedTree() { root = null; } public E findMin() { current = root; while(current.getLeft() !=null) { current = current.getLeft(); } return current.getData(); } public E findMax() { while(current.getRight() != null) { current = current.getRight(); } return current.getData(); } public void makeEmpty() { root = null; } public boolean isEmpty() { if(root==null) return true; else return false; } public void insertThreaded(E x) { if (root==null) { root = new ThreadedTreeNode(x); return; } current = root; // //find appropriate null node to insert new node while(current != null) { //initialize trailer to current trailer = current; //if x > current.data, move to right subtree if (x.compareTo(current.getData())>0) { trailer = current; current = current.getRight(); } //if x < current.data, move to left subtree else if (x.compareTo(current.getData())<0) { trailer = current; current = current.getLeft(); } //break loop if node x already exist in tree. else { return; } } // //current is null, compare x with trailer.data and insert x as child to trailer. //if x > trailer.data, move to right subtree if (x.compareTo(trailer.getData())>0) { //create new node for x with null left reference and right thread from trailer ThreadedTreeNode node = new ThreadedTreeNode(x, null, trailer.getRight()); //set trailer right reference to x trailer.setRight(node); //remove isThread flag from trailer trailer.setIsThread(false); } //if x < trailer.data, move to left subtree else if(x.compareTo(trailer.getData())<0) { //create new node for x with null left reference and right thread from trailer ThreadedTreeNode node = new ThreadedTreeNode(x, null, trailer); node.setIsThread(true); //set trailer left reference to x trailer.setLeft(node); //remove isThread flag from trailer trailer.setIsThread(false); } //do nothing if node x already exists in tree else { return; } } public void inorderThreadedPrint() { current = root; while(current.getLeft() != null) { current = current.getLeft(); } do { if(current.getIsThread()==true) { System.out.println(current.getData()); current = current.getRight(); } else if(current.getIsThread()==false) { System.out.println(current.getData()); current = current.getRight(); while(current.getLeft() != null) { current = current.getLeft(); } } } while(current!=null); } public void levelThreadedPrint() { } }