#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
struct Node{
int val;
struct Node *left, *right;
Node(int v): val(v), left(NULL), right(NULL){}
};
struct Node* buildTree(int nums[], int arrsize, int *index, int min, int max){
if (*index > arrsize || *index < 0) return NULL;
Node* root = NULL;
int val = nums[*index];
if (val < max && val > min){
root = new Node(val);
++(*index);
if (*index < arrsize){
root->left = buildTree(nums, arrsize, index, min, val);
root->right = buildTree(nums, arrsize, index, val, max);
}
}
return root;
}
struct Node* constructBST(int nums[], int arrsize){
int idx = 0;
return buildTree(nums, arrsize, &idx, INT_MIN, INT_MAX);
}
bool findPath(Node *root, vector<int>& path, int val){
if (!root) return false;
path.push_back(root->val);
if (root->val == val) return true;
if( (root->left && findPath(root->left, path, val) ) ||
(root->right && findPath(root->right, path, val)))
return true;
path.pop_back();
return false;
}
int getDistance(Node *root, int node1, int node2){
vector<int> path1, path2;
if (!findPath(root,path1,node1) || !findPath(root,path2,node2))
return 0;
int common_node = 0;
for (int i = 0; i < path1.size() && path2.size(); ++i){
if (path1[i] != path2[i]) break;
++common_node;
}
cout << path1.size() << "; " << path2.size() << "; " << common_node << endl;
return (path1.size() + path2.size() - 2 * common_node);
}
int main() {
//code
int nums[] = {5,6,3,1,2,4};
int arrsize = sizeof(nums)/sizeof(nums[0]);
Node *root = constructBST(nums, arrsize);
cout << "The distance is " << getDistance(root, 4,6) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGltaXRzLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZXsKICAgIGludCB2YWw7CiAgICBzdHJ1Y3QgTm9kZSAqbGVmdCwgKnJpZ2h0OwogICAgTm9kZShpbnQgdik6IHZhbCh2KSwgbGVmdChOVUxMKSwgcmlnaHQoTlVMTCl7fQp9OwoKc3RydWN0IE5vZGUqIGJ1aWxkVHJlZShpbnQgbnVtc1tdLCBpbnQgYXJyc2l6ZSwgaW50ICppbmRleCwgaW50IG1pbiwgaW50IG1heCl7CiAgICBpZiAoKmluZGV4ID4gYXJyc2l6ZSB8fCAqaW5kZXggPCAwKSByZXR1cm4gTlVMTDsKICAgIAogICAgTm9kZSogcm9vdCA9ICBOVUxMOwogICAgaW50IHZhbCA9IG51bXNbKmluZGV4XTsKICAgIGlmICh2YWwgPCBtYXggJiYgdmFsID4gbWluKXsKICAgICAgICByb290ID0gbmV3IE5vZGUodmFsKTsKICAgICAgICArKygqaW5kZXgpOwogICAgICAgIGlmICgqaW5kZXggPCBhcnJzaXplKXsKICAgICAgICAgICAgcm9vdC0+bGVmdCA9IGJ1aWxkVHJlZShudW1zLCBhcnJzaXplLCBpbmRleCwgbWluLCB2YWwpOwogICAgICAgICAgICByb290LT5yaWdodCA9IGJ1aWxkVHJlZShudW1zLCBhcnJzaXplLCBpbmRleCwgdmFsLCBtYXgpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KICAgIHJldHVybiByb290Owp9CgpzdHJ1Y3QgTm9kZSogY29uc3RydWN0QlNUKGludCBudW1zW10sIGludCBhcnJzaXplKXsKICAgIGludCBpZHggPSAwOwogICAgcmV0dXJuIGJ1aWxkVHJlZShudW1zLCBhcnJzaXplLCAmaWR4LCBJTlRfTUlOLCBJTlRfTUFYKTsKfQoKYm9vbCBmaW5kUGF0aChOb2RlICpyb290LCB2ZWN0b3I8aW50PiYgcGF0aCwgaW50IHZhbCl7CiAgICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIHBhdGgucHVzaF9iYWNrKHJvb3QtPnZhbCk7CiAgICAKICAgIGlmIChyb290LT52YWwgPT0gdmFsKSByZXR1cm4gdHJ1ZTsKICAgIAogICAgaWYoIChyb290LT5sZWZ0ICYmIGZpbmRQYXRoKHJvb3QtPmxlZnQsIHBhdGgsIHZhbCkgKSB8fAogICAgICAgIChyb290LT5yaWdodCAmJiBmaW5kUGF0aChyb290LT5yaWdodCwgcGF0aCwgdmFsKSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICBwYXRoLnBvcF9iYWNrKCk7CiAgICByZXR1cm4gZmFsc2U7Cn0KaW50IGdldERpc3RhbmNlKE5vZGUgKnJvb3QsIGludCBub2RlMSwgaW50IG5vZGUyKXsKICAgIHZlY3RvcjxpbnQ+IHBhdGgxLCBwYXRoMjsKICAgIGlmICghZmluZFBhdGgocm9vdCxwYXRoMSxub2RlMSkgfHwgIWZpbmRQYXRoKHJvb3QscGF0aDIsbm9kZTIpKQogICAgICAgIHJldHVybiAwOwogICAgaW50IGNvbW1vbl9ub2RlID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aDEuc2l6ZSgpICYmIHBhdGgyLnNpemUoKTsgKytpKXsKICAgICAgICBpZiAocGF0aDFbaV0gIT0gcGF0aDJbaV0pIGJyZWFrOwogICAgICAgICsrY29tbW9uX25vZGU7CiAgICB9CiAgICBjb3V0IDw8IHBhdGgxLnNpemUoKSA8PCAiOyAiIDw8ICBwYXRoMi5zaXplKCkgPDwgIjsgIiA8PCBjb21tb25fbm9kZSA8PCBlbmRsOwogICAgcmV0dXJuIChwYXRoMS5zaXplKCkgKyBwYXRoMi5zaXplKCkgLSAyICogY29tbW9uX25vZGUpOwp9CmludCBtYWluKCkgewoJLy9jb2RlCglpbnQgbnVtc1tdID0gezUsNiwzLDEsMiw0fTsKCWludCBhcnJzaXplID0gc2l6ZW9mKG51bXMpL3NpemVvZihudW1zWzBdKTsKCQoJTm9kZSAqcm9vdCA9IGNvbnN0cnVjdEJTVChudW1zLCBhcnJzaXplKTsKCQoJY291dCA8PCAiVGhlIGRpc3RhbmNlIGlzICIgPDwgZ2V0RGlzdGFuY2Uocm9vdCwgNCw2KSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==