Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

[JAVA] You are given two non-empty binary search tree T1 and T2. T1 and T2 store the same keys. The structure of both trees, however,

[JAVA]

You are given two non-empty binary search tree T1 and T2. T1 and T2 store the same keys. The structure of both trees, however, is different. Implement an algorithm that uses rotations on T1 to make it equivalent to T2. That is, both trees should have identical structure. Note that you are only allowed to use rotations and only on T1; you are not allowed to modify the trees in any other way. There is no strict overall runtime for this assignment. You should still try to keep it as low as possible. Very slow implementations will still result in a loss of points.

Here is the code that need to be implemented:

import java.io.*; import java.util.*; public class BST { /** * Problem: Perform rotations on tree1 to make it equivalent to tree2. */ public static void problem(BST tree1, BST tree2) { // Implement me! } // --------------------------------------------------------------------- // Do not change any of the code below! private class Node { public Node left = null; public Node right = null; public Node parent = null; public int key; public Node(int key) { this.key = key; } } private Node root = null; public int getRootKey() { return root.key; } private Node find(int key) { for (Node cur = root; cur != null;) { if (key < cur.key) { cur = cur.left; } else if (key == cur.key) { return cur; } else // key > cur.key { cur = cur.right; } } return null; } // x y

// / \ / \ // a y => x c // / \ / \ // b c a b private void rotateL(Node xNode) { Node xPar = xNode.parent; boolean isRoot = xPar == null; boolean isLChild = !isRoot && xPar.left == xNode; Node yNode = xNode.right; Node beta = yNode.left; if (isRoot) root = yNode; else if (isLChild) xPar.left = yNode; else xPar.right = yNode; yNode.parent = xPar; yNode.left = xNode; xNode.parent = yNode; xNode.right = beta; if (beta != null) beta.parent = xNode; } // y x // / \ / \ // x c => a y // / \ / \ // a b b c private void rotateR(Node yNode) { Node yPar = yNode.parent; boolean isRoot = yPar == null; boolean isLChild = !isRoot && yPar.left == yNode; Node xNode = yNode.left; Node beta = xNode.right; if (isRoot) root = xNode; else if (isLChild) yPar.left = xNode; else yPar.right = xNode; xNode.parent = yPar; xNode.right = yNode; yNode.parent = xNode; yNode.left = beta; if (beta != null) beta.parent = yNode; } public void insert(int key) { if (root == null) { root = new Node(key); return;

} Node par = null; for (Node node = root; node != null;) { par = node; if (key < node.key) { node = node.left; } else if (key > node.key) { node = node.right; } else // key == node.key { // Nothing to do, because no value to update. return; } } // Create node and set pointers. Node newNode = new Node(key); newNode.parent = par; if (key < par.key) par.left = newNode; else par.right = newNode; } public int[] getInOrder() { if (root == null) return new int[] { }; Stack stack = new Stack(); ArrayList orderList = new ArrayList(); for (Node node = root;;) { if (node == null) { if (stack.empty()) break; node = stack.pop(); orderList.add(node.key); node = node.right; } else { stack.push(node); node = node.left; } } int[] order = new int[orderList.size()]; for (int i = 0; i < order.length; i++) { order[i] = orderList.get(i);

} return order; } public int[] getPreOrder() { if (root == null) return new int[] { }; Stack stack = new Stack(); ArrayList orderList = new ArrayList(); for (Node node = root;;) { if (node == null) { if (stack.empty()) break; node = stack.pop(); node = node.right; } else { orderList.add(node.key); stack.push(node); node = node.left; } } int[] order = new int[orderList.size()]; for (int i = 0; i < order.length; i++) { order[i] = orderList.get(i); } return order; }

}

Here is the code that test the function

import java.io.*; import java.util.*; public class Lab1 { // --------------------------------------------------------------------- // Do not change any of the code below! private static final int LabNo = 1; private static final Random rng = new Random(190718); private static boolean testProblem(int[][] testCase) { int[] arr1 = testCase[0]; int[] arr2 = testCase[1]; // --- Build tree --- BST tree1 = new BST(); BST tree2 = new BST(); for (int i = 0; i < arr1.length; i++) { tree1.insert(arr1[i]); tree2.insert(arr2[i]); } int[] pre2 = tree2.getPreOrder(); BST.problem(tree1, tree2); // --- Verify tree. --- int[] pre1 = tree1.getPreOrder(); int[] in1 = tree1.getInOrder(); if (in1.length != arr1.length) return false; for (int i = 0; i < in1.length; i++) { if (in1[i] != i) return false; if (pre1[i] != pre2[i]) return false; } return true; } public static void main(String args[]) { System.out.println("CS 302 -- Lab " + LabNo); testProblems(1); } private static void testProblems(int prob) { int noOfLines = 100000;

System.out.println("-- -- -- -- --"); System.out.println(noOfLines + " test cases for problem " + prob + "."); boolean passedAll = true; long start = System.currentTimeMillis(); for (int i = 1; i <= noOfLines; i++) { boolean passed = false; boolean exce = false; try { int[][] testCase = createProblem(i); passed = testProblem(testCase); } catch (Exception ex) { passed = false; exce = true; } if (!passed) { System.out.println("Test " + i + " failed!" + (exce ? " (Exception)" : "")); passedAll = false; break; } } System.out.println((System.currentTimeMillis() - start) + " ms"); if (passedAll) { System.out.println("All test passed."); } } private static void shuffle(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int rndInd = rng.nextInt(arr.length - i) + i; int tmp = arr[i]; arr[i] = arr[rndInd]; arr[rndInd] = tmp; } } private static int[][] createProblem(int testNo) { int size = rng.nextInt(Math.min(200, testNo)) + 1; int[] numbers1 = new int[size]; int[] numbers2 = new int[size]; for (int i = 0; i < size; i++) { numbers1[i] = i;

numbers2[i] = i; } shuffle(numbers1); shuffle(numbers2); return new int[][] { numbers1, numbers2 }; }

}

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

Recommended Textbook for

OCA Oracle Database SQL Exam Guide Exam 1Z0-071

Authors: Steve O'Hearn

1st Edition

1259585492, 978-1259585494

More Books

Students also viewed these Databases questions