In: Computer Science
complete java binary search tree
/*
* Complete the printInLevelOrder() method
* Complete the visuallyIdentical(A4BST rhs) method
* No other methods/variables should be added/modified
*/
public class A4BST<E extends Comparable<? super E>>
{
/*
* Grading:
* Correctly prints values in level order - 1.5pt
* Runs in O(N) - 1.5pt
*/
public String printInLevelOrder()
{
String content = "";
/*
* Add items from the tree to
content one level at a time
* No line breaks are required
between levels
* Ensure method runs in O(N) - does
not revisit any node
*/
return content;
}
/*
* Grading:
* Correctly compares the structure of both trees -
3pts
*/
public boolean visuallyIdentical(A4BST rhs)
{
/*
* Check if the structure of the
local tree and the rhs tree are identical
* This means they have the same
left/right connections
* This means there are no extra
connections in either tree
* The values at each position do
not need to match, only the structure of the tree
* Think about if you drew both
trees on paper, would they visually look the same (besides
values)
*/
return false;
}
private Node root;
public A4BST()
{
root = null;
}
public String printTree()
{
return printTree(root);
}
private String printTree(Node current)
{
String content = "";
if(current != null)
{
content +=
"Current:"+current.data.toString();
if(current.left
!= null)
{
content += "; Left
side:"+current.left.data.toString();
}
if(current.right
!= null)
{
content += "; Right
side:"+current.right.data.toString();
}
content+="\n";
content+=printTree(current.left);
content+=printTree(current.right);
}
return content;
}
public String printInOrder()
{
return printInOrder(root);
}
private String printInOrder(Node current)
{
String content = "";
if(current != null)
{
content +=
printInOrder(current.left);
content +=
current.data.toString()+",";
content +=
printInOrder(current.right);
}
return content;
}
public boolean contains(E val)
{
Node result = findNode(val,
root);
if(result != null)
return
true;
else
return
false;
}
private Node findNode(E val, Node current)
{
//base cases
if(current == null)
return
null;
if(current.data.equals(val))
return
current;
//recursive cases
int result =
current.data.compareTo(val);
if(result < 0)
return
findNode(val, current.right);
else
return
findNode(val, current.left);
}
public E findMin()
{
Node result = findMin(root);
if(result == null)
return
null;
else
return
result.data;
}
private Node findMin(Node current)//used in findMin
and delete
{
while(current.left != null)
{
current =
current.left;
}
return current;
}
public E findMax()
{
Node current = root;
while(current.right != null)
{
current =
current.right;
}
return current.data;
}
public void insert(E val)
{
root = insertHelper(val,
root);
}
public Node insertHelper(E val, Node current)
{
if(current == null)
{
return new
Node(val);
}
int result =
current.data.compareTo(val);
if(result < 0)
{
current.right =
insertHelper(val, current.right);
}
else if(result > 0)
{
current.left =
insertHelper(val, current.left);
}
else//update
{
current.data =
val;
}
return current;
}
public void remove(E val)
{
root = removeHelper(val,
root);
}
private Node removeHelper(E val, Node current)
{
if(current.data.equals(val))
{
if(current.left
== null && current.right == null)//no children
{
return null;
}
else
if(current.left != null && current.right != null)//two
children
{
Node result = findMin(current.right);
result.right = removeHelper(result.data,
current.right);
result.left = current.left;
return result;
}
else//one
child
{
return (current.left != null)? current.left :
current.right;
}
}
int result =
current.data.compareTo(val);
if(result < 0)
{
current.right =
removeHelper(val, current.right);
}
else if(result > 0)
{
current.left =
removeHelper(val, current.left);
}
return current;
}
private class Node
{
E data;
Node left, right;
public Node(E d)
{
data = d;
left =
null;
right =
null;
}
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class A4Driver {
public static void main(String[] args) {
A4BST<Integer> tree1 = new
A4BST<>();
tree1.insert(5);
tree1.insert(3);
tree1.insert(1);
tree1.insert(2);
tree1.insert(9);
tree1.insert(10);
tree1.insert(25);
A4BST<Integer> tree2 = new
A4BST<>();
tree2.insert(8);
tree2.insert(5);
tree2.insert(1);
tree2.insert(3);
tree2.insert(15);
tree2.insert(20);
tree2.insert(25);
A4BST<Integer> tree3 = new
A4BST<>();
tree3.insert(1);
tree3.insert(2);
tree3.insert(3);
tree3.insert(5);
tree3.insert(9);
tree3.insert(10);
tree3.insert(25);
System.out.println(tree1.printInLevelOrder());//5, 3, 9, 1, 10, 2,
25
System.out.println(tree2.printInLevelOrder());//8, 5, 15, 1, 20, 3,
25
System.out.println(tree3.printInLevelOrder());//1, 2, 3, 4, 5, 9,
10, 25
System.out.println(tree1.visuallyIdentical(tree2));//true
System.out.println(tree1.visuallyIdentical(tree3));//false
}
}
/* A4BST.java */
import java.util.LinkedList;
import java.util.Queue;
public class A4BST<E extends Comparable<? super
E>> {
/*
* Grading:
* Correctly prints values in level order - 1.5pt
* Runs in O(N) - 1.5pt
*/
public String printInLevelOrder()
{
String content = "";
/*
* Add items from the tree to content one level at a time
* No line breaks are required between levels
* Ensure method runs in O(N) - does not revisit any node
*/
// Base Case
if(root == null)
return content;
// Create an empty queue for level order tarversal
Queue<Node> q =new LinkedList<Node>();
// Enqueue Root and initialize height
q.add(root);
while(true)
{
// nodeCount (queue size) indicates number of nodes
// at current level.
int nodeCount = q.size();
if(nodeCount == 0)
break;
// Dequeue all nodes of current level and Enqueue all
// nodes of next level
while(nodeCount > 0)
{
Node node = q.peek();
content= content + node.data + " ";
q.remove();
if(node.left != null)
q.add(node.left);
if(node.right != null)
q.add(node.right);
nodeCount--;
}
}
return content;
}
/*
* Grading:
* Correctly compares the structure of both trees - 3pts
*/
public boolean visuallyIdentical(A4BST rhs)
{
/*
* Check if the structure of the local tree and the rhs tree are
identical
* This means they have the same left/right connections
* This means there are no extra connections in either tree
* The values at each position do not need to match, only the
structure of the tree
* Think about if you drew both trees on paper, would they visually
look the same (besides values)
*/
// Return true if both trees are empty
if (this.root == null && rhs.root == null) return
true;
// Return false if one is empty and other is not
if (this.root == null || rhs.root == null) return
false;
// Create an empty queues for simultaneous
traversals
Queue<Node > q1 = new LinkedList<Node> ();
Queue<Node> q2 = new LinkedList<Node> ();
// Enqueue Roots of trees in respective queues
q1.add(this.root);
q2.add(rhs.root);
while (!q1.isEmpty() && !q2.isEmpty())
{
// Get front nodes and compare them
Node n1 = q1.peek();
Node n2 = q2.peek();
// Remove front nodes from queues
q1.remove();
q2.remove();
/* Enqueue left children of both nodes */
if (n1.left != null && n2.left != null)
{
q1.add(n1.left);
q2.add(n2.left);
}
// If one left child is empty and other is not
else if (n1.left != null || n2.left != null)
return false;
// Right child code (Similar to left child code)
if (n1.right != null && n2.right != null)
{
q1.add(n1.right);
q2.add(n2.right);
}
else if (n1.right != null || n2.right != null)
return false;
}
return true;
}
private Node root;
public A4BST()
{
root = null;
}
public String printTree()
{
return printTree(root);
}
private String printTree(Node current)
{
String content = "";
if(current != null)
{
content += "Current:"+current.data.toString();
if(current.left != null)
{
content += "; Left side:"+current.left.data.toString();
}
if(current.right != null)
{
content += "; Right side:"+current.right.data.toString();
}
content+="\n";
content+=printTree(current.left);
content+=printTree(current.right);
}
return content;
}
public String printInOrder()
{
return printInOrder(root);
}
private String printInOrder(Node current)
{
String content = "";
if(current != null)
{
content += printInOrder(current.left);
content += current.data.toString()+",";
content += printInOrder(current.right);
}
return content;
}
public boolean contains(E val)
{
Node result = findNode(val, root);
if(result != null)
return true;
else
return false;
}
private Node findNode(E val, Node current)
{
//base cases
if(current == null)
return null;
if(current.data.equals(val))
return current;
//recursive cases
int result = current.data.compareTo(val);
if(result < 0)
return findNode(val, current.right);
else
return findNode(val, current.left);
}
public E findMin()
{
Node result = findMin(root);
if(result == null)
return null;
else
return result.data;
}
private Node findMin(Node current)//used in findMin and
delete
{
while(current.left != null)
{
current = current.left;
}
return current;
}
public E findMax()
{
Node current = root;
while(current.right != null)
{
current = current.right;
}
return current.data;
}
public void insert(E val)
{
root = insertHelper(val, root);
}
public Node insertHelper(E val, Node current)
{
if(current == null)
{
return new Node(val);
}
int result = current.data.compareTo(val);
if(result < 0)
{
current.right = insertHelper(val, current.right);
}
else if(result > 0)
{
current.left = insertHelper(val, current.left);
}
else//update
{
current.data = val;
}
return current;
}
public void remove(E val)
{
root = removeHelper(val, root);
}
private Node removeHelper(E val, Node current)
{
if(current.data.equals(val))
{
if(current.left == null && current.right == null)//no
children
{
return null;
}
else if(current.left != null && current.right != null)//two
children
{
Node result = findMin(current.right);
result.right = removeHelper(result.data, current.right);
result.left = current.left;
return result;
}
else//one child
{
return (current.left != null)? current.left : current.right;
}
}
int result = current.data.compareTo(val);
if(result < 0)
{
current.right = removeHelper(val, current.right);
}
else if(result > 0)
{
current.left = removeHelper(val, current.left);
}
return current;
}
private class Node
{
E data;
Node left, right;
public Node(E d)
{
data = d;
left = null;
right = null;
}
}
}
/* A4Driver.java */
public class A4Driver {
public static void main(String[] args) {
A4BST<Integer> tree1 = new A4BST<>();
tree1.insert(5);
tree1.insert(3);
tree1.insert(1);
tree1.insert(2);
tree1.insert(9);
tree1.insert(10);
tree1.insert(25);
A4BST<Integer> tree2 = new A4BST<>();
tree2.insert(8);
tree2.insert(5);
tree2.insert(1);
tree2.insert(3);
tree2.insert(15);
tree2.insert(20);
tree2.insert(25);
A4BST<Integer> tree3 = new A4BST<>();
tree3.insert(1);
tree3.insert(2);
tree3.insert(3);
tree3.insert(5);
tree3.insert(9);
tree3.insert(10);
tree3.insert(25);
System.out.println(tree1.printInLevelOrder());//5, 3, 9, 1, 10, 2,
25
System.out.println(tree2.printInLevelOrder());//8, 5, 15, 1, 20, 3,
25
System.out.println(tree3.printInLevelOrder());//1, 2, 3, 4, 5, 9,
10, 25
System.out.println(tree1.visuallyIdentical(tree2));//true
System.out.println(tree1.visuallyIdentical(tree3));//false
}
}
/* OUTPUT */
/* PLEASE UPVOTE */