Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Implement the ADT dictionary by using a binary search tree . Use the ADT dictionary in a word count program. Your class WordCount will take

Implement the ADT dictionary by using a binary search tree. Use the ADT dictionary in a word count program. Your class WordCount will take an input from command line for the name of a text file. This text file will contain words or numbers that are tokenized (separated by whitespace). The code I have included is simply the class heirarchy that needs to be utilized in this program.

BinaryNode.java

public class BinaryNode { private T data; private BinaryNode leftChild, rightChild; public BinaryNode() { this(null); } public BinaryNode(T data) { this(data, null, null); } public BinaryNode(T data, BinaryNode left, BinaryNode right) { this.data = data; leftChild = left; setRightChild(right); } public T getData() { return data; } public void setData(T data) { this.data = data; } public BinaryNode getLeftChild(){ return leftChild; } public void setLeftChild(BinaryNode left) { leftChild = left; }

public BinaryNode getRightChild() { return rightChild; }

public void setRightChild(BinaryNode right) { this.rightChild = right; } public boolean hasLeftChild() { return leftChild != null; } public boolean hasRightChild() { return rightChild != null; } public boolean isLeaf() { return (!hasLeftChild() && !hasRightChild()); } public BinaryNode copy(){ BinaryNode newRoot = new BinaryNode(data); if(leftChild != null) { newRoot.setLeftChild(leftChild.copy()); } if(rightChild != null) { newRoot.setRightChild(rightChild.copy()); } return newRoot; } public int getHeight() { return getHeight(this); } private int getHeight(BinaryNode node) { int height = 0; if(node != null) { height = 1 + Math.max(getHeight(node.getLeftChild()), getHeight(node.getRightChild())); } return height; } public int getNumberOfNodes() { return getNumberOfNodes(this); } private int getNumberOfNodes(BinaryNode node) { int rightNumber = 0; int leftNumber = 0; if(leftChild != null) { leftNumber = getNumberOfNodes(node.getLeftChild()); } if(rightChild != null) { rightNumber = getNumberOfNodes(node.getRightChild()); } return 1 + leftNumber + rightNumber; } }

BinaryTree.java

import java.util.Iterator; import java.util.Stack;

public class BinaryTree implements BinaryTreeInterface {

private BinaryNode root;

public BinaryTree() { root = null; }

public BinaryTree(T rootData) { root = new BinaryNode(rootData); }

public BinaryTree(T rootData, BinaryTree leftTree, BinaryTree rightTree) { privateSetTree(rootData, leftTree, rightTree); }

public void setTree(T rootData) { root = new BinaryNode(rootData); }

public void setTree(T rootData, BinaryTree left, BinaryTree right) { privateSetTree(rootData, left, right); }

private void privateSetTree(T rootData, BinaryTree left, BinaryTree right) { root = new BinaryNode<>(rootData);

if ((left != null) && (!left.isEmpty())) { root.setLeftChild(left.root.copy()); } if ((right != null) && (!right.isEmpty())) { root.setRightChild(right.root.copy()); } }

public T getRootData() { return root.getData(); }

public int getHeight() { return root.getHeight(); }

public int getNumberOfNodes() { return root.getNumberOfNodes(); }

public boolean isEmpty() { return root == null; }

public void clear() { root = null; }

protected BinaryNode getRootNode() { return root; }

public Iterator getPreorderIterator() { throw new UnsupportedOperationException("Preorder not supported."); }

public Iterator getInorderIterator() { throw new UnsupportedOperationException("Inorder not supported."); }

public Iterator getPostorderIterator() { return new PostorderIterator(); }

public Iterator getLevelorderIterator() { throw new UnsupportedOperationException("Level Order not supported."); }

private class PostorderIterator implements Iterator {

private Stack> nodeStack; private BinaryNode current;

public PostorderIterator() { nodeStack = new Stack<>(); current = root; populateStack(current); } private void populateStack(BinaryNode node){ nodeStack.add(node); if(node.hasRightChild()){ populateStack(node.getRightChild()); } if(node.hasLeftChild()){ populateStack(node.getLeftChild()); } }

public boolean hasNext() { return !nodeStack.isEmpty(); }

public T next() { return nodeStack.pop().getData(); }

}

}

BinaryTreeInterface.java

public interface BinaryTreeInterface extends TreeInterface, TreeIteratorInterface{ public void setTree(T rootData); public void setTree(T rootData, BinaryTree left, BinaryTree right); }

TreeIteratorInterface.java

import java.util.Iterator;

public interface TreeIteratorInterface { public Iterator getPreorderIterator(); public Iterator getInorderIterator(); public Iterator getPostorderIterator(); public Iterator getLevelorderIterator(); }

TreeInterface.java

public interface TreeInterface { public T getRootData(); public int getHeight(); public int getNumberOfNodes(); public boolean isEmpty(); public void clear(); }

SearchTreeInterface.java

import java.util.Iterator;

public interface SearchTreeInterface>

extends TreeInterface{

public boolean contains(T entry);

public T getEntry(T entry);

publlic T add(T newEntry);

public T remove(T entry);

public Iterator getInorderIterator;

}

BinarySearchTree>

extends BinaryTree

implements SearchTreeInterface{

public BinarySearchTree(){

super();

}

public BinarySearchTree(T rootEntry){

super();

setRootNode(new BinaryNode (rootEntry));

}

public void setTree(T rootData){

throw new UnsupportedOperationException();

}

public void setTree(T rootData, BinaryTreeInterface leftTree, BinaryTreeInterface rightTree)

{

throw new UnsupportedOperationException();

}

public T getEntry(T entry)

{

return findEntry(getRootNode(), entry);

}

private T findEntry(BinaryNode rootNode, T entry)

{

T result = null;

if(rootNode != null)

{

T rootEntry = rootNode.getData();

if(entry.equals(rootEntry))

{

result = rootEntry;

}

else if(entry.compareTo(rootEntry) < 0)

{

result = findEntry(rootNode.getLeftChild(), entry);

}

else

{

result = findEntry(rootNode.getRightChild(), entry);

}

}

return result;

}

public boolean contains(T entry)

{

return getEntry(entry) != null;

}

public T add(T newEntry)

{

T result = null;

if(isEmpty())

{

setRootNode(new BinaryNode<>(newEntry));

}

else

{

result = addEntry(getRootNode(), newEntry);

}

return result;

}

private T addEntry(BinaryNode rootNode, T newEntry)

{

assert rootNode != null;

T result = null;

int comparison = newEntry.compareTo(rootNode.getData());

if(comparison == 0)

{

result = rootNode.getData();

rootNode.setData(newEntry);;

}

else if(comparison < 0)

{

if(rootNode.hasLeftChild())

{

result = addEntry(rootNode.getLeftChild(), newEntry);

}

else

{

rootNode.setLeftChild(new BinaryNode<>(newEntry));

}

}

else

{

assert comparison > 0;

if(rootNode.hasRightChild())

{

result = addEntry(rootNode.getRightChild(), newEntry);

}

else

{

rootNode.setRightChild(new BinaryNode<>(newEntry));

}

}

return result;

}

public T remove(T entry)

{

ReturnObject oldEntry = new ReturnObject(null);

BinaryNode newRoot = removeEntry(getRootNode(), entry, oldEntry);

setRootNode(newRoot);

return oldEntry.get();

}

private BinaryNode removeEntry(BinaryNode rootNode, T entry, ReturnObject oldEntry)

{

if(rootNode != null)

{

T rootData = rootNode.getData();

int comparison = entry.compareTo(rootData);

if(comparison == 0)

{

oldEntry.set(rootData);

rootNode = removeFromRoot(rootNode);

}

else if(comparison < 0)

{

BinaryNode leftChild = rootNode.getLeftChild();

BinaryNode subtreeRoot = removeEntry(leftChild, entry, oldEntry);

rootNode.setLeftChild(subtreeRoot);;

}

else

{

BinaryNode rightChild = rootNode.getRightChild();

rootNode.setRightChild(removeEntry(rightChild, entry, oldEntry));

} // end if

}// end if

return rootNode;

}

private BinaryNode removeFromRoot(BinaryNode rootNode)

{

if(rootNode.hasLeftChild() && rootNode.hasRightChild())

{

BinaryNode leftSubtreeRoot = rootNode.getLeftChild();

BinaryNode largestNode = findLargest(leftSubtreeRoot);

rootNode.setData(largestNode.getData());

rootNode.setLeftChild(removeLargest(leftSubtreeRoot));

}

else if(rootNode.hasRightChild())

{

rootNode = rootNode.getRightChild();

}

else

{

rootNode = rootNode.getLeftChild();

}

return rootNode;

}

private BinaryNode findLargest(BinaryNode rootNode)

{

if(rootNode.hasRightChild())

{

rootNode = findLargest(rootNode.getRightChild());

}

return rootNode;

}

private BinaryNode removeLargest(BinaryNode rootNode)

{

if(rootNode.hasRightChild())

{

BinaryNode rightChild = rootNode.getRightChild();

rightChild = removeLargest(rightChild);

rootNode.setRightChild(rightChild);

}

else

{

rootNode = rootNode.getLeftChild();

}

return rootNode;

}

public Iterator getInorderIterator()

{

return getInorderIterator();

} // end getInorderIterator

private class ReturnObject

{

T entry;

public ReturnObject()

{

// do nothing

}

public ReturnObject(T newEntry)

{

entry = newEntry;

}

public void set(T newEntry)

{

entry = newEntry;

}

public T get()

{

return entry;

}

}

}

BstDictonary.java

public class BstDictionary , V> implements DictionaryInterface

{

private SearchTreeInterface> bst;

private int count;

public BstDictionary()

{

bst = new BinarySearchTree();

}

public V add(K key, V value)

{

Entry newEntry = new Entry<>(key,value);

Entry returnedEntry = bst.add(newEntry);

V result = null;

if(returnedEntry != null)

result = returnedEntry.getValue();

count++;

return result;

}

public V getValue(K key)

{

return bst.get(key);

}

public V remove(K key)

{

Entry findEntry = new Entry<>(key, null);

Entry returnedEntry = bst.remove(findEntry);

V result = null;

if(returnedEntry != null)

result = returnedEntry.getValue();

count--;

return result;

}

public Iterator getKeyIterator()

{

return new KeyIterator();

}

private class KeyIterator implements Iterator

{

Iterator> localIterator;

public KeyIterator()

{

localIterator = bst.getInorderIterator();

}

public boolean hasNext()

{

return localIterator.hasNext();

}

public K next()

{

Entry nextEntry = localIterator.next();

return nextEntry.getKey();

}

public void remove()

{

throw new UnsupportedOperationException();

}

}

private class Entry, T> implements Comparable>

{

private S key;

private T value;

private Entry(S searchKey, T dataValue)

{

key = searchKey;

value = dataValue;

}

public V getValue() {

// TODO Auto-generated method stub

return null;

}

public K getKey() {

return null;

}

public int compareTo(Entry other)

{

return key.compareTo(other.key);

}

} // end Entry

} // end BstDictionary

The output should be like this:

input.text

This 1

is 2

dogs 3

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Students also viewed these Databases questions