DSA/algorithms/Java/trees/left-view.java

191 lines
5.2 KiB
Java

/* Given a Binary Tree, print Left view of it.
Left view of a Binary Tree is set of nodes visible when tree is visited from Left side. */
import java.util.LinkedList;
import java.util.Queue;
import java.io.*;
import java.util.*;
class Node{
int data;
Node left;
Node right;
Node(int data){
this.data = data;
left=null;
right=null;
}
}
//Main Class
class Main {
static Node buildTree(String str){
if(str.length()==0 || str.charAt(0)=='N'){
return null;
}
String ip[] = str.split(" ");
// Create the root of the tree
Node root = new Node(Integer.parseInt(ip[0]));
// Push the root to the queue
Queue<Node> queue = new LinkedList<>();
queue.add(root);
// Starting from the second element
int i = 1;
while(queue.size()>0 && i < ip.length) {
// Get and remove the front of the queue
Node currNode = queue.peek();
queue.remove();
// Get the current node's value from the string
String currVal = ip[i];
// If the left child is not null
if(!currVal.equals("N")) {
// Create the left child for the current node
currNode.left = new Node(Integer.parseInt(currVal));
// Push it to the queue
queue.add(currNode.left);
}
// For the right child
i++;
if(i >= ip.length)
break;
currVal = ip[i];
// If the right child is not null
if(!currVal.equals("N")) {
// Create the right child for the current node
currNode.right = new Node(Integer.parseInt(currVal));
// Push it to the queue
queue.add(currNode.right);
}
i++;
}
return root;
}
static void printInorder(Node root) {
//Print inorder of tree.
if(root == null)
return;
printInorder(root.left);
System.out.print(root.data+" ");
printInorder(root.right);
}
public static void main (String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//number of testcases.
int t=Integer.parseInt(br.readLine());
while(t > 0){
//Input a string for tree
String s = br.readLine();
Node root = buildTree(s);
Tree g = new Tree();
//calculate in left view of tree by calling function
ArrayList<Integer> result1 = g.leftViewIterative(root);
ArrayList<Integer> result2 = g.leftViewRecursive(root);
//print the result
System.out.println("Iterative Solution:");
for(int value : result1){
System.out.print(value + " ");
}
System.out.println("Recursive Solution:");
for(int value : result2){
System.out.print(value + " ");
}
System.out.println();
t--;
}
}
}
class Tree {
ArrayList<Integer> al;
//Iterative Approach
ArrayList<Integer> leftViewIterative(Node root) {
al = new ArrayList<Integer>();
if(root==null) return al;
//create a queue to store the node of treees
Queue<Node> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
int n = q.size();
//loop through available nodes in queue.
for(int i=1;i<=n;i++){
Node temp = q.poll();
//add first node from queue as it would be left most node
if(i==1) al.add(temp.data);
if(temp.left!=null) q.add(temp.left);
if(temp.right!=null) q.add(temp.right);
}
}
return al;
}
//Recursive Approach
int maxlvl=0;
ArrayList<Integer> leftViewRecursive(Node root) {
al = new ArrayList<Integer>();
//start from root of the tree
leftViewUtil(root, 1);
return al;
}
void leftViewUtil(Node node, int lvl){
if(node==null) return;
//first occurrence of the level will get added
if(maxlvl<lvl){
al.add(node.data);
//make the max level to curr level
maxlvl = lvl;
}
//increment the level of tree to get left most of next level
leftViewUtil(node.left, lvl+1);
leftViewUtil(node.right, lvl+1);
}
}
/* Input :
1
/ \
2 3
/ \ \
4 5 6
Output :
Iterative Approach:
1 2 4
Recursive Approach:
1 2 4
Input :
1
/ \
2 3
\
4
\
5
\
6
Output :
Iterative Approach:
1 2 4 5 6
Recursive Approach:
1 2 4 5 6
Time Complexity: O(n) , where n is the number of nodes in the binary tree.
Auxiliary Space: O(n), due to the stack space during recursive call.
*/