110 lines
3.0 KiB
Java
110 lines
3.0 KiB
Java
|
/** Author : Suraj Kumar
|
||
|
* Github : https://github.com/skmodi649
|
||
|
*/
|
||
|
|
||
|
/** PROBLEM DESCRIPTION :
|
||
|
* There is a Binary Search Tree given and we are supposed to find a random node in the given binary tree.
|
||
|
*/
|
||
|
|
||
|
/** ALGORITHM :
|
||
|
* Step 1: START
|
||
|
* Step 2: First create a binary tree using the steps mentioned in the first approach
|
||
|
* Step 3: Now use a method inOrder() that takes a node as input parameter to traverse through the
|
||
|
* binary tree in inorder fashion as also store the values in a ArrayList simultaneously.
|
||
|
* Step 4: Now define a method getrandom() that takes a node as input parameter, in this first call
|
||
|
* the inOrder() method to store the values in the arraylist, then find the size of the binary tree and now just generate a random number between 0 to n-1.
|
||
|
* Step 5: After generating the number display the value of the ArrayList at the generated index
|
||
|
* Step 6: STOP
|
||
|
*/
|
||
|
|
||
|
|
||
|
import java.util.ArrayList;
|
||
|
|
||
|
// Using auxiliary array to find the random node in a given binary tree
|
||
|
class Node {
|
||
|
int item;
|
||
|
Node left, right;
|
||
|
|
||
|
public Node(int key) {
|
||
|
item = key;
|
||
|
left = right = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Tree {
|
||
|
|
||
|
// Using a arraylist to store the inorder traversal of the given binary tree
|
||
|
static ArrayList<Integer> list = new ArrayList<Integer>();
|
||
|
// root of Tree
|
||
|
Node root;
|
||
|
|
||
|
Tree() {
|
||
|
root = null;
|
||
|
}
|
||
|
|
||
|
// Now lets find the inorder traversal of the given binary tree
|
||
|
static void inOrder(Node node) {
|
||
|
if (node == null)
|
||
|
return;
|
||
|
|
||
|
// traverse the left child
|
||
|
inOrder(node.left);
|
||
|
|
||
|
list.add(node.item);
|
||
|
// traverse the right child
|
||
|
inOrder(node.right);
|
||
|
}
|
||
|
|
||
|
public void getrandom(Node val)
|
||
|
{
|
||
|
inOrder(val);
|
||
|
// getting the count of node of the binary tree
|
||
|
int n = list.size();
|
||
|
int min = 0;
|
||
|
int max = n - 1;
|
||
|
//Generate random int value from 0 to n-1
|
||
|
int b = (int)(Math.random()*(max-min+1)+min);
|
||
|
// displaying the value at the generated index
|
||
|
int random = list.get(b);
|
||
|
System.out.println("Random Node : " + random);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
Tree tree = new Tree();
|
||
|
|
||
|
|
||
|
tree.root = new Node(1);
|
||
|
tree.root.left = new Node(12);
|
||
|
tree.root.right = new Node(9);
|
||
|
tree.root.left.left = new Node(5);
|
||
|
tree.root.left.right = new Node(6);
|
||
|
|
||
|
tree.getrandom(tree.root);
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Explanation of the Approach :
|
||
|
* (a) Form the required binary tree
|
||
|
* (b) Now use the inOrder() method to get the nodes in inOrder fashion and also store them in the given arraylist 'list'
|
||
|
* (c) Using the getRandom() method generate a random number between 0 to n-1, then get the value at the generated random number
|
||
|
* from the arraylist using get() method and finally display the result.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/** OUTPUT :
|
||
|
* First output :
|
||
|
* Random Node : 15
|
||
|
* Second output :
|
||
|
* Random Node : 99
|
||
|
*/
|
||
|
|
||
|
/** Time Complexity : O(n)
|
||
|
* Auxiliary Space Complexity : O(1)
|
||
|
*/
|
||
|
|