int findClosestUtil(node *root, node **ance, int k, int level){ if(root == NULL) return INT_MAX; int res = INT_MAX; if(root->data == k){ int a = findClosestDown(root); for(int i=level-1; i>=0; i--){ res = min(res, level - i + findClosestDown(ance[i])); } return min(res, a); } ance[level] = root; level++; return min(findClosestUtil(root->left, ance, k, level), findClosestUtil(root->right, ance, k, level)); }
int get_closest_leaf_distance(struct node *root, struct node *temp) { if (root==NULL||temp==NULL) return -1; struct node *ancestors[100]; return findClosestUtil(root, temp, ancestors, 0); }
int findClosestUtil(struct node *root,struct node *temp, struct node *ancestors[],int index) { if (root == NULL) return INT_MAX; if (root->data == temp->data ) { int res = closestDown(root); for (int i = index - 1; i >= 0; i--) res = getmin(res, index - i + closestDown(ancestors[i])); return res; } ancestors[index] = root; int close_left = findClosestUtil(root->left, temp, ancestors, index + 1); int close_right = findClosestUtil(root->right, temp, ancestors, index + 1); return getmin(close_left,close_right); }
int findClosest(node *root, int k){ node *ance[100]; return findClosestUtil(root, ance, k, 0); }