// An iterative C program to find LCA of two nodes n1 and n2.
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* left, *right;
};
/* Function to find LCA of n1 and n2. The function assumes that both
n1 and n2 are present in BST */
struct node *lca(struct node* root, int n1, int n2)
{
while (root != NULL)
{
// If both n1 and n2 are greater than root, then LCA lies in left
if (root->data > n1 && root->data > n2)
root = root->left;
// If both n1 and n2 are smaller than root, then LCA lies in right
else if (root->data < n1 && root->data < n2)
root = root->right;
else break;
}
return root;
}
/* Helper function that allocates a new node with the given data.*/
struct node* newNode(int data)
{
struct node
* node
= (struct node
*)malloc(sizeof(struct node
)); node->data = data;
node->left = node->right = NULL;
return(node);
}
/* Driver program to test mirror() */
int main()
{
// Let us construct the BST shown in the above figure
struct node *root = newNode(20);
root->left = newNode(8);
root->right = newNode(22);
root->left->left = newNode(4);
root->left->right = newNode(12);
root->left->right->left = newNode(10);
root->left->right->right = newNode(14);
int n1 = 10, n2 = 14;
struct node *t = lca(root, n1, n2);
printf("LCA of %d and %d is %d \n", n1
, n2
, t
->data
);
n1 = 14, n2 = 8;
t = lca(root, n1, n2);
printf("LCA of %d and %d is %d \n", n1
, n2
, t
->data
);
n1 = 10, n2 = 22;
t = lca(root, n1, n2);
printf("LCA of %d and %d is %d \n", n1
, n2
, t
->data
);
return 0;
}
Ly8gQW4gaXRlcmF0aXZlIEMgcHJvZ3JhbSB0byBmaW5kIExDQSBvZiB0d28gbm9kZXMgbjEgYW5kIG4yLgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKc3RydWN0IG5vZGUKewogICAgaW50IGRhdGE7CiAgICBzdHJ1Y3Qgbm9kZSogbGVmdCwgKnJpZ2h0Owp9OwoKLyogRnVuY3Rpb24gdG8gZmluZCBMQ0Egb2YgbjEgYW5kIG4yLiBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGJvdGgKICAgbjEgYW5kIG4yIGFyZSBwcmVzZW50IGluIEJTVCAqLwpzdHJ1Y3Qgbm9kZSAqbGNhKHN0cnVjdCBub2RlKiByb290LCBpbnQgbjEsIGludCBuMikKewogICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkKICAgIHsKICAgICAgICAgLy8gSWYgYm90aCBuMSBhbmQgbjIgYXJlIGdyZWF0ZXIgdGhhbiByb290LCB0aGVuIExDQSBsaWVzIGluIGxlZnQKICAgICAgICBpZiAocm9vdC0+ZGF0YSA+IG4xICYmIHJvb3QtPmRhdGEgPiBuMikKICAgICAgICAgICByb290ID0gcm9vdC0+bGVmdDsKCiAgICAgICAgLy8gSWYgYm90aCBuMSBhbmQgbjIgYXJlIHNtYWxsZXIgdGhhbiByb290LCB0aGVuIExDQSBsaWVzIGluIHJpZ2h0CiAgICAgICAgZWxzZSBpZiAocm9vdC0+ZGF0YSA8IG4xICYmIHJvb3QtPmRhdGEgPCBuMikKICAgICAgICAgICByb290ID0gcm9vdC0+cmlnaHQ7CgogICAgICAgIGVsc2UgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKfQoKLyogSGVscGVyIGZ1bmN0aW9uIHRoYXQgYWxsb2NhdGVzIGEgbmV3IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4qLwpzdHJ1Y3Qgbm9kZSogbmV3Tm9kZShpbnQgZGF0YSkKewogICAgc3RydWN0IG5vZGUqIG5vZGUgPSAoc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgIG5vZGUtPmRhdGEgID0gZGF0YTsKICAgIG5vZGUtPmxlZnQgID0gbm9kZS0+cmlnaHQgPSBOVUxMOwogICAgcmV0dXJuKG5vZGUpOwp9CgovKiBEcml2ZXIgcHJvZ3JhbSB0byB0ZXN0IG1pcnJvcigpICovCmludCBtYWluKCkKewogICAgLy8gTGV0IHVzIGNvbnN0cnVjdCB0aGUgQlNUIHNob3duIGluIHRoZSBhYm92ZSBmaWd1cmUKICAgIHN0cnVjdCBub2RlICpyb290ICAgICAgICA9IG5ld05vZGUoMjApOwogICAgcm9vdC0+bGVmdCAgICAgICAgICAgICAgID0gbmV3Tm9kZSg4KTsKICAgIHJvb3QtPnJpZ2h0ICAgICAgICAgICAgICA9IG5ld05vZGUoMjIpOwogICAgcm9vdC0+bGVmdC0+bGVmdCAgICAgICAgID0gbmV3Tm9kZSg0KTsKICAgIHJvb3QtPmxlZnQtPnJpZ2h0ICAgICAgICA9IG5ld05vZGUoMTIpOwogICAgcm9vdC0+bGVmdC0+cmlnaHQtPmxlZnQgID0gbmV3Tm9kZSgxMCk7CiAgICByb290LT5sZWZ0LT5yaWdodC0+cmlnaHQgPSBuZXdOb2RlKDE0KTsKCiAgICBpbnQgbjEgPSAxMCwgbjIgPSAxNDsKICAgIHN0cnVjdCBub2RlICp0ID0gbGNhKHJvb3QsIG4xLCBuMik7CiAgICBwcmludGYoIkxDQSBvZiAlZCBhbmQgJWQgaXMgJWQgXG4iLCBuMSwgbjIsIHQtPmRhdGEpOwoKICAgIG4xID0gMTQsIG4yID0gODsKICAgIHQgPSBsY2Eocm9vdCwgbjEsIG4yKTsKICAgIHByaW50ZigiTENBIG9mICVkIGFuZCAlZCBpcyAlZCBcbiIsIG4xLCBuMiwgdC0+ZGF0YSk7CgogICAgbjEgPSAxMCwgbjIgPSAyMjsKICAgIHQgPSBsY2Eocm9vdCwgbjEsIG4yKTsKICAgIHByaW50ZigiTENBIG9mICVkIGFuZCAlZCBpcyAlZCBcbiIsIG4xLCBuMiwgdC0+ZGF0YSk7CgogICAgZ2V0Y2hhcigpOwogICAgcmV0dXJuIDA7Cn0K