#include using namespace std; // Structure of a BST Node class Node { public: int val; Node* left; Node* right; }; /* Utility function to create a new Binary Tree Node */ Node* newNode(int data) { Node* temp = new Node; temp->val = data; temp->left = nullptr; temp->right = nullptr; return temp; } vector mergeTwoBST(Node* root1, Node* root2) { vector res; stack s1, s2; while (root1 || root2 || !s1.empty() || !s2.empty()) { while (root1) { s1.push(root1); root1 = root1->left; } while (root2) { s2.push(root2); root2 = root2->left; } // Step 3 Case 1:- if (s2.empty() || (!s1.empty() && s1.top()->val <= s2.top()->val)) { root1 = s1.top(); s1.pop(); res.push_back(root1->val); root1 = root1->right; } // Step 3 case 2 :- else { root2 = s2.top(); s2.pop(); res.push_back(root2->val); root2 = root2->right; } } return res; } /* Driver program to test above functions */ int main() { Node *root1 = nullptr, *root2 = nullptr; /* Let us create the following tree as first tree 3 / \ 1 5 */ root1 = newNode(3); root1->left = newNode(1); root1->right = newNode(5); /* Let us create the following tree as second tree 4 / \ 2 6 */ root2 = newNode(4); root2->left = newNode(2); root2->right = newNode(6); // Print sorted Nodes of both trees vector ans = mergeTwoBST(root1, root2); for (auto it : ans) cout << it << " "; return 0; }