#c #algorithm #data-structures
#c #алгоритм #структуры данных
Вопрос:
Учитывая getInorderSuccessor функция, которая принимает по британскому летнему времени (бинарное дерево поиска) в качестве параметра. Каждый узел имеет дополнительную стрелку «вперед» , который инициализируется в null, заполните рядом с узлом указатели, которые представляют симметричного преемника. мой следующий код не дает правильного вывода
node * getInorderSuccessor(node * root){
struct node * current = root;
static int flag = 0;
if (root != NULL)
{
if (flag != 2)
{
current->next = getInorderSuccessor(current->left);
}
if(current ==root)
flag = 1;
if (flag == 1)
{
flag = 2;
current->next = root;
}
if (flag!=2)
{
current->next = getInorderSuccessor(current->right);
}
}
Ответ №1:
Предполагая, что «левый» и «правый» будет низким:
Если есть left
ветки, вышестоящий узел будет в нем. Так что преемником будет самой низкой (правый) узел в left
филиал.
Если нет left
филиала, то нужно идти вверх по дереву (к корню) до следующего узла вверх-слева от текущего узла, т. е. до текущего узла (как мы поднимаемся дерева) — это right
ветви своего родителя. Что родитель будет преемником.
В любом случае, нужно каким-то образом зная, что каждый родительский узел имеет, по крайней мере, на путь к текущему узлу… так как вам может понадобиться, чтобы перейти к корню дерева. Это может быть parent
указатель в каждом узле, или какой-то список узлов по пути до текущей.
Что касается кода, я не уверен, как вы это имели в виду для работы, но:
current->next = getInorderSuccessor(current->left);
…выглядит странно. Если current->left
это большая ветка, то current->left
с наследника будет по крайней мере два узла С current
, поэтому он не мог быть current
с непосредственным наследником. Если left
это низко растущую ветку, она может не содержать current
с преемника, так что это все равно не имеет смысла.
Я также не вижу return
заявление в любом месте.
Ответ №2:
Та же статическая переменная является общей для всех (рекурсивных) вызовов функции. Если вы хотите запомнить путь, где вы остановились, вам нужно больше (или других) переменных.