/* Merge Binary Search Trees
* http://stackoverflow.com/a/7732490
* Author: Jiri, http://stackoverflow.com/users/805681/jiri
* Created 11-Oct-2011 / Reloaded at ideone.com on 24-Jan-2018
* Programming language C++
* References:
* http://stackoverflow.com/questions/7540546/merging-2-binary-search-trees
* http://d...content-available-to-author-only...t.com/
* http://c...content-available-to-author-only...d.edu/109/
* http://w...content-available-to-author-only...e.com/2010/11/convert-binary-search-tree-bst-to.html
* http://w...content-available-to-author-only...e.com/2010/11/convert-sorted-list-to-balanced-binary.html
*/
#include <stdio.h>
struct Node {
int info;
Node* left;
Node* right;
};
void insert(Node*& root, int info) {
if (root == 0) {
root = new Node();
root->info = info;
}
else if (info < root->info)
insert(root->left, info);
else if (info > root->info)
insert(root->right, info);
else
printf("Error: duplicate key %d ignored", info);
}
void printSpine(Node* head) {
for (Node* current = head; current; current = current->right)
printf("%d ", current->info);
printf("\n");
}
void printTree(Node* node, int level) {
for (int i = 0; i < level; ++i) printf(" ");
printf("%d\n", node->info);
if (node->left)
printTree(node->left, level + 1);
if (node->right)
printTree(node->right, level + 1);
}
void spine(Node *p, Node *& prev, Node *& head) {
if (!p)
return;
spine(p->left, prev, head);
if (prev)
prev->right = p;
else
head = p;
prev = p;
p->left = 0;
spine(p->right, prev, head);
}
Node* balance(Node *& list, int start, int end) {
if (start > end)
return NULL;
int mid = start + (end - start) / 2;
Node *leftChild = balance(list, start, mid-1);
Node *parent = list;
parent->left = leftChild;
list = list->right;
parent->right = balance(list, mid+1, end);
return parent;
}
Node* balance(Node *head) {
int size = 0;
for (Node* n = head; n; n = n->right) ++size;
return balance(head, 0, size-1);
}
void advance(Node*& last, Node*& n) {
last->right = n;
last = n;
n = n->right;
}
Node* mergeSpines(Node* n1, Node* n2) {
Node head;
Node* last = &head;
while (n1 || n2) {
if (!n1)
advance(last, n2);
else if (!n2)
advance(last, n1);
else if (n1->info < n2->info)
advance(last, n1);
else if (n1->info > n2->info)
advance(last, n2);
else {
advance(last, n1);
printf("Duplicate key skipped %d \n", n2->info);
n2 = n2->right;
}
}
return head.right;
}
Node* merge(Node* n1, Node* n2) {
Node *prev, *head1, *head2;
prev = head1 = 0;
spine(n1, prev, head1);
prev = head2 = 0;
spine(n2, prev, head2);
Node* root = mergeSpines(head1, head2);
return balance(root);
}
int main(int argc, char** argv) {
Node* root1 = 0;
insert(root1, 14);
insert(root1, 12);
insert(root1, 1);
insert(root1, 3);
insert(root1, 56);
insert(root1, 6);
insert(root1, 73);
Node* root2 = 0;
insert(root2, 4);
insert(root2, 22);
insert(root2, 21);
insert(root2, 13);
insert(root2, 5);
insert(root2, 16);
insert(root2, 7);
Node* root = merge(root1, root2);
printTree(root, 0);
return 0;
}
LyogTWVyZ2UgQmluYXJ5IFNlYXJjaCBUcmVlcwogKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS83NzMyNDkwCiAqIEF1dGhvcjogSmlyaSwgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3VzZXJzLzgwNTY4MS9qaXJpCiAqIENyZWF0ZWQgMTEtT2N0LTIwMTEgLyBSZWxvYWRlZCBhdCBpZGVvbmUuY29tIG9uIDI0LUphbi0yMDE4CiAqIFByb2dyYW1taW5nIGxhbmd1YWdlIEMrKwogKiBSZWZlcmVuY2VzOgogKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc1NDA1NDYvbWVyZ2luZy0yLWJpbmFyeS1zZWFyY2gtdHJlZXMKICogaHR0cDovL2QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tLwogKiBodHRwOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZC5lZHUvMTA5LwogKiBodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vMjAxMC8xMS9jb252ZXJ0LWJpbmFyeS1zZWFyY2gtdHJlZS1ic3QtdG8uaHRtbAogKiBodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vMjAxMC8xMS9jb252ZXJ0LXNvcnRlZC1saXN0LXRvLWJhbGFuY2VkLWJpbmFyeS5odG1sCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgaW5mbzsKICAgIE5vZGUqIGxlZnQ7CiAgICBOb2RlKiByaWdodDsKfTsKCnZvaWQgaW5zZXJ0KE5vZGUqJiByb290LCBpbnQgaW5mbykgewogICAgaWYgKHJvb3QgPT0gMCkgewogICAgICAgIHJvb3QgPSBuZXcgTm9kZSgpOwogICAgICAgIHJvb3QtPmluZm8gPSBpbmZvOwogICAgfQogICAgZWxzZSBpZiAoaW5mbyA8IHJvb3QtPmluZm8pIAogICAgICAgIGluc2VydChyb290LT5sZWZ0LCBpbmZvKTsKICAgIGVsc2UgaWYgKGluZm8gPiByb290LT5pbmZvKSAKICAgICAgICBpbnNlcnQocm9vdC0+cmlnaHQsIGluZm8pOwogICAgZWxzZSAKICAgICAgICBwcmludGYoIkVycm9yOiBkdXBsaWNhdGUga2V5ICVkIGlnbm9yZWQiLCBpbmZvKTsKfQoKdm9pZCBwcmludFNwaW5lKE5vZGUqIGhlYWQpIHsKICAgIGZvciAoTm9kZSogY3VycmVudCA9IGhlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5yaWdodCkKICAgICAgICBwcmludGYoIiVkICIsIGN1cnJlbnQtPmluZm8pOwogICAgcHJpbnRmKCJcbiIpOwp9Cgp2b2lkIHByaW50VHJlZShOb2RlKiBub2RlLCBpbnQgbGV2ZWwpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkgcHJpbnRmKCIgIik7CiAgICBwcmludGYoIiVkXG4iLCBub2RlLT5pbmZvKTsKICAgIGlmIChub2RlLT5sZWZ0KSAKICAgICAgICBwcmludFRyZWUobm9kZS0+bGVmdCwgbGV2ZWwgKyAxKTsKICAgIGlmIChub2RlLT5yaWdodCkgCiAgICAgICAgcHJpbnRUcmVlKG5vZGUtPnJpZ2h0LCBsZXZlbCArIDEpOwp9Cgp2b2lkIHNwaW5lKE5vZGUgKnAsIE5vZGUgKiYgcHJldiwgTm9kZSAqJiBoZWFkKSB7ICAgCiAgICBpZiAoIXApIAogICAgICAgIHJldHVybjsgICAKICAgIHNwaW5lKHAtPmxlZnQsIHByZXYsIGhlYWQpOyAgIAogICAgaWYgKHByZXYpIAogICAgICAgIHByZXYtPnJpZ2h0ID0gcDsgICAKICAgIGVsc2UgCiAgICAgICAgaGVhZCA9IHA7ICAKICAgIHByZXYgPSBwOwogICAgcC0+bGVmdCA9IDA7CiAgICBzcGluZShwLT5yaWdodCwgcHJldiwgaGVhZCk7IAp9IAoKTm9kZSogYmFsYW5jZShOb2RlIComIGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKHN0YXJ0ID4gZW5kKSAKICAgICAgICByZXR1cm4gTlVMTDsgIAogICAgaW50IG1pZCA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAvIDI7ICAgIAogICAgTm9kZSAqbGVmdENoaWxkID0gYmFsYW5jZShsaXN0LCBzdGFydCwgbWlkLTEpOyAgIAogICAgTm9kZSAqcGFyZW50ID0gbGlzdDsKICAgIHBhcmVudC0+bGVmdCA9IGxlZnRDaGlsZDsgICAKICAgIGxpc3QgPSBsaXN0LT5yaWdodDsgICAKICAgIHBhcmVudC0+cmlnaHQgPSBiYWxhbmNlKGxpc3QsIG1pZCsxLCBlbmQpOyAgIAogICAgcmV0dXJuIHBhcmVudDsgCn0gICAKCk5vZGUqIGJhbGFuY2UoTm9kZSAqaGVhZCkgewogICAgaW50IHNpemUgPSAwOwogICAgZm9yIChOb2RlKiBuID0gaGVhZDsgbjsgbiA9IG4tPnJpZ2h0KSArK3NpemU7CiAgICByZXR1cm4gYmFsYW5jZShoZWFkLCAwLCBzaXplLTEpOyAKfSAKCnZvaWQgYWR2YW5jZShOb2RlKiYgbGFzdCwgTm9kZSomIG4pIHsKICAgIGxhc3QtPnJpZ2h0ID0gbjsgCiAgICBsYXN0ID0gbjsKICAgIG4gPSBuLT5yaWdodDsgCn0KCk5vZGUqIG1lcmdlU3BpbmVzKE5vZGUqIG4xLCBOb2RlKiBuMikgewogICAgTm9kZSBoZWFkOwogICAgTm9kZSogbGFzdCA9ICZoZWFkOwogICAgd2hpbGUgKG4xIHx8IG4yKSB7CiAgICAgICAgaWYgKCFuMSkgCiAgICAgICAgICAgIGFkdmFuY2UobGFzdCwgbjIpOwogICAgICAgIGVsc2UgaWYgKCFuMikgCiAgICAgICAgICAgIGFkdmFuY2UobGFzdCwgbjEpOwogICAgICAgIGVsc2UgaWYgKG4xLT5pbmZvIDwgbjItPmluZm8pIAogICAgICAgICAgICBhZHZhbmNlKGxhc3QsIG4xKTsKICAgICAgICBlbHNlIGlmIChuMS0+aW5mbyA+IG4yLT5pbmZvKSAKICAgICAgICAgICAgYWR2YW5jZShsYXN0LCBuMik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFkdmFuY2UobGFzdCwgbjEpOwogICAgICAgICAgICBwcmludGYoIkR1cGxpY2F0ZSBrZXkgc2tpcHBlZCAlZCBcbiIsIG4yLT5pbmZvKTsKICAgICAgICAgICAgbjIgPSBuMi0+cmlnaHQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGhlYWQucmlnaHQ7IAp9CgpOb2RlKiBtZXJnZShOb2RlKiBuMSwgTm9kZSogbjIpIHsKICAgIE5vZGUgKnByZXYsICpoZWFkMSwgKmhlYWQyOyAgIAogICAgcHJldiA9IGhlYWQxID0gMDsgCiAgICBzcGluZShuMSwgcHJldiwgaGVhZDEpOyAKICAgIHByZXYgPSBoZWFkMiA9IDA7CiAgICBzcGluZShuMiwgcHJldiwgaGVhZDIpOwogICAgTm9kZSogcm9vdCA9IG1lcmdlU3BpbmVzKGhlYWQxLCBoZWFkMik7CiAgICByZXR1cm4gYmFsYW5jZShyb290KTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICBOb2RlKiByb290MSA9IDA7ICAgIAogICAgaW5zZXJ0KHJvb3QxLCAxNCk7CiAgICBpbnNlcnQocm9vdDEsIDEyKTsKICAgIGluc2VydChyb290MSwgMSk7CiAgICBpbnNlcnQocm9vdDEsIDMpOwogICAgaW5zZXJ0KHJvb3QxLCA1Nik7CiAgICBpbnNlcnQocm9vdDEsIDYpOwogICAgaW5zZXJ0KHJvb3QxLCA3Myk7CiAgICAgICAgCiAgICBOb2RlKiByb290MiA9IDA7ICAgIAogICAgaW5zZXJ0KHJvb3QyLCA0KTsKICAgIGluc2VydChyb290MiwgMjIpOwogICAgaW5zZXJ0KHJvb3QyLCAyMSk7CiAgICBpbnNlcnQocm9vdDIsIDEzKTsKICAgIGluc2VydChyb290MiwgNSk7CiAgICBpbnNlcnQocm9vdDIsIDE2KTsKICAgIGluc2VydChyb290MiwgNyk7CgogICAgTm9kZSogcm9vdCA9IG1lcmdlKHJvb3QxLCByb290Mik7CiAgICBwcmludFRyZWUocm9vdCwgMCk7CiAgICByZXR1cm4gMDsgCn0gCg==