Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Don't copy paste from other people's work I will dislike it immediately 1) In Java you are given the root nodes of two binary search

Don't copy paste from other people's work I will dislike it immediately

1) In Java you are given the root nodes of two binary search trees. Determine if both trees store the same numbers. Note that the trees do not need to be equivalent in the structure; the question is only if they store the same numbers. Implement an iterative and recursive solution.

It needs to add a recursive & iterative solution that passes all 100000 test cases, if it works I will like it immediately

import java.io.*; import java.util.*; public class Main { /** * Problem 1: Determine if two given binary search trees store the same numbers. Iterative Solution */ private static boolean problem1Iterative(Node t1, Node t2) { // Implement me! return false; } /** * Problem 1: Determine if two given binary search trees store the same numbers. Recursive Solution */ private static boolean problem1Recursive(Node t1, Node t2) { // Implement me! return false; } // --------------------------------------------------------------------- // Do not change any of the code below! private static class Node { public Node left = null; public Node right = null; public int key; public Node(int key) { this.key = key; } } private static void insert(Node root, int key) { if (root == null) { root = new Node(key); return; } for (Node node = root;;) { if (key < node.key) { if (node.left == null) { node.left = new Node(key); } node = node.left; } else if (key > node.key) { if (node.right == null) { node.right = new Node(key); } node = node.right; } else // key = node.key { // Nothing to do, because no value to update. break; } } } private static boolean find(Node root, int key){ if(root == null) { return false; } if(root.key == key) { return true; } if(key < root.key) { return find(root.left, key); } else { return find(root.right, key); } } private static int[] getInOrder(Node root) { 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; } private static int[] getPreOrder(Node root) { 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; } private static int[] getPostOrder(Node root) { if (root == null) return new int[] { }; Stack stack = new Stack(); Stack stackCtr = new Stack(); ArrayList orderList = new ArrayList(); stack.push(root); stackCtr.push(0); while (!stack.empty()) { int ctr = stackCtr.pop(); Node node = stack.peek(); if (ctr == 0) { // First visit. stackCtr.push(1); if (node.left != null) { stack.push(node.left); stackCtr.push(0); } } else if (ctr == 1) { // Second visit. // Left subtree done. stackCtr.push(2); if (node.right != null) { stack.push(node.right); stackCtr.push(0); } } else // ctr >= 2 { // Third visit. // Right subtree done. stack.pop(); orderList.add(node.key); } } int[] order = new int[orderList.size()]; for (int i = 0; i < order.length; i++) { order[i] = orderList.get(i); } return order; } // --------------------------------------------------------------------- private static final Random rng = new Random(654321); public static void main(String args[]) { testProblems(1, 1); testProblems(1, 2); testProblems(2, 1); testProblems(2, 2); } private static boolean testProblem1(int[][] testCase, int style) { int[] tree1 = testCase[0]; int[] tree2 = testCase[1]; boolean solution = testCase[2][0] == 1; Node root1 = new Node(tree1[0]); Node root2 = new Node(tree2[0]); for (int i = 1; i < tree1.length; i++) { insert(root1, tree1[i]); insert(root2, tree2[i]); } boolean answer; if(style == 1) { answer = problem1Iterative(root1, root2); }else{ answer = problem1Recursive(root1, root2); } return solution == answer; } private static boolean testProblem2(int[][] testCase, int style) { int[] tree = testCase[0]; int[] range = testCase[1]; int solution = testCase[2][0]; Node root = new Node(tree[0]); for (int i = 1; i < tree.length; i++) { insert(root, tree[i]); } int answer; if(style == 1) { answer = problem2Iterative(root, range[0], range[1]); }else{ answer = problem2Recursive(root, range[0], range[1]); } return answer == solution; } private static void testProblems(int prob, int style) { int noOfLines = 100000; System.out.println("-- -- -- -- --"); switch (style) { case 1: System.out.println(noOfLines + " test cases for problem " + prob + " iterative solution."); break; case 2: System.out.println(noOfLines + " test cases for problem " + prob + " recursive solution."); break; } boolean passedAll = true; for (int i = 1; i <= noOfLines; i++) { boolean passed = false; boolean exce = false; int[][] testCase = null; try { switch (prob) { case 1: testCase = createProblem1(i); passed = testProblem1(testCase, style); break; case 2: testCase = createProblem2(i); passed = testProblem2(testCase, style); break; } } catch (Exception ex) { passed = false; exce = true; } if (!passed) { System.out.println("Test " + i + " failed!" + (exce ? " (Exception)" : "")); if (prob == 1) { System.out.println(" tree 1: " + Arrays.toString(testCase[0])); System.out.println(" tree 2: " + Arrays.toString(testCase[1])); } else { System.out.println(" tree: " + Arrays.toString(testCase[0])); System.out.println(" range: " + Arrays.toString(testCase[1])); } passedAll = false; break; } } if (passedAll) { System.out.println("All test passed."); } } private static void shuffle(int[] arr) { for (int i = 0; i < arr.length; i++) { int rndInd = rng.nextInt(arr.length - i) + i; int tmp = arr[i]; arr[i] = arr[rndInd]; arr[rndInd] = tmp; } } private static int[] getRandomNumbers(int size) { int maxSize = size * 10; int[] integers = new int[maxSize]; for (int i = 0; i < maxSize; i++) { integers[i] = i; } shuffle(integers); return Arrays.copyOf(integers, size); } private static int[][] createProblem1(int max) { int maxSize = max < 250 ? max : 250; int size = rng.nextInt(maxSize) + 5; int equal = rng.nextInt(2); int[] tree1 = getRandomNumbers(size); int[] tree2 = tree1.clone(); if (equal == 0) { int ind = rng.nextInt(tree1.length); tree1[ind]+=6543; } int chance = rng.nextInt(10); if(chance == 2) { int ind1 = rng.nextInt(tree1.length); int ind2 = rng.nextInt(tree1.length); int temp = tree1[ind1]; tree1[ind1] = tree1[ind2]; tree1[ind2] = temp; }

return new int[][] { tree1, tree2, new int[] { equal } }; } private static int[][] createProblem2(int max) { int maxSize = max < 250 ? max : 250; int size = rng.nextInt(maxSize) + 5; int[] keys = getRandomNumbers(2 * size); int minKey = keys[rng.nextInt(2 * size)]; int maxKey = keys[rng.nextInt(2 * size)]; shuffle(keys); int[] tree = Arrays.copyOf(keys, size); int sum = 0; for (int i = 0; i < tree.length; i++) { if (tree[i] >= minKey && tree[i] <= maxKey) { sum += tree[i]; } } return new int[][] { tree, new int[] { minKey, maxKey }, new int[] { sum } }; } }

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

Question

How autonomous should the target be left after the merger deal?

Answered: 1 week ago