package com.interview.tree;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
/**
* Next inorder iterator of two trees.
* Merging tree to print one result
*/
public class NextInorderSuccessorOfTwoTree {
private Node root1 = null;
private Node root2 = null;
Stack<Node> stack1 = new Stack<Node>();
Stack<Node> stack2 = new Stack<Node>();
Set<Node> visited = new HashSet<Node>();
NextInorderSuccessorOfTwoTree(Node root1, Node root2) {
this.root1 = root1;
this.root2 = root2;
}
public boolean hasNext() {
if (root1 != null || stack1.size() > 0 || root2 != null
|| stack2.size() > 0) {
return true;
}
return false;
}
public Node next() {
Node node = null;
while (root1 != null) {
stack1.push(root1);
root1 = root1.left;
}
while (root2 != null) {
stack2.push(root2);
root2 = root2.left;
}
if (!stack1.isEmpty() && !stack2.isEmpty()) {
if (stack1.peek().data <= stack2.peek().data) {
node = stack1.pop();
root1 = node.right;
} else {
node = stack2.pop();
root2 = node.right;
}
} else if (stack1.isEmpty()) {
node = stack2.pop();
root2 = node.right;
} else {
node = stack1.pop();
root1 = node.right;
}
return node;
}
public static void main(String args[]){
BinaryTree bt = new BinaryTree();
Node node = null;
node = bt.addNode(10, node);
node = bt.addNode(-5, node);
node = bt.addNode(7, node);
node = bt.addNode(20, node);
node = bt.addNode(3, node);
node = bt.addNode(14, node);
Node node1 = null;
node1 = bt.addNode(8, node1);
node1 = bt.addNode(-10, node1);
node1 = bt.addNode(18, node1);
node1 = bt.addNode(2, node1);
node1 = bt.addNode(11, node1);
NextInorderSuccessorOfTwoTree nis = new NextInorderSuccessorOfTwoTree(node, node1);
while(nis.hasNext()){
System.out.println(nis.next().data);
}
}
}