import java.util.*;
class BinaryTreeUtil {
public Node root;
static class Node {
int data;
Node left;
Node right;
Node(int data) {
this.data = data;
}
}
public static void main
(String[] args
) { BinaryTreeUtil sizeUtil = new BinaryTreeUtil();
sizeUtil.root = sizeUtil.getSampleTree();
System.
out.
println("Size of the tree is " + sizeUtil.
getSize(sizeUtil.
root));
letsDo("Inorder Traversal");
sizeUtil.inorderTraversal(sizeUtil.root);
newLine();
letsDo("Level Order Traversal in Reverse Order using Stack and Queue");
sizeUtil.levelOrderTraversalInReverseOrderUsingStackAndQueue(sizeUtil.root);
newLine();
}
public static void letsDo
(String task
) { System.
out.
println("=============" + task
+ "=================="); }
public static void newLine() {
}
public Node getSampleTree() {
Node root = new Node(1);
root.left = new Node(2);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right = new Node(3);
return root;
}
public int getSize(Node root) {
if (root == null)
return 0;
return getSize(root.left) + 1 + getSize(root.right);
}
public void inorderTraversal(Node root) {
if (root == null)
return;
inorderTraversal(root.left);
System.
out.
print(root.
data + ","); inorderTraversal(root.right);
}
public void levelOrderTraversalInReverseOrderUsingStackAndQueue(Node root) {
Stack<Node> stack = new Stack<>();
Queue<Node> queue = new LinkedList<>();
Node temp;
queue.add(root);
while (!queue.isEmpty()) {
temp = queue.poll();
stack.push(temp);
// Enqueue first Right then left because we are storing the end result in stack which is actually LIFO
if (temp.right != null) {
queue.add(temp.right);
}
if (temp.left != null) {
queue.add(temp.left);
}
}
while (!stack.isEmpty()) {
temp = stack.pop();
if (temp == null) {
continue;
}
System.
out.
print(temp.
data + "\t"); }
}
}