При прохождении дерева следите за минимумом, который вы нашли на этом пути. Это можно легко сделать, добавив третий аргумент, минимальный найденный до сих пор.
Если вы найдете цель, верните минимум.
Если вы достигнете листа, верните INTMAX
.
int MinParent_(struct Node *node, int target, int min) {
if (node == NULL)
return INTMAX;
if (node->data == target)
return min;
if (node->data < min)
min = node->data;
int rv = MinParent_(node->left, target, min);
if (rv != INTMAX)
return rv;
return MinParent_(node->right, target, min);
}
int MinParent(struct Node *root, int target) {
return MinParent_(root, target, INTMAX);
}
Используется значение часового. Это означает, что данные не могут содержать INTMAX
. Мы могли бы использовать указатель на узел с минимальным значением вместо самого минимального значения, чтобы снять это ограничение.
struct Node *MinParent_(struct Node *node, int target, struct Node *min_node) {
if (node == NULL)
return NULL;
if (node->data == target)
return min_node;
if (!min_node || node->data < min_node->data)
min_node = node;
struct Node *rv = MinParent_(node->left, target, min_node);
if (rv)
return rv;
return MinParent_(node->right, target, min_node);
}
struct Node *MinParent(struct Node *root, int target) {
return MinParent_(root, target, NULL);
}