Узел дерева содержит 3 указателя * влево, * вправо и * преемник.
Struct node{
int data;
struct node *left;
struct node *right;
struct node *successor;
};
A
/ \
B C
/ \ / \
D E F G
Обход INORDER: DBEAFCG
* Примечание: * Преемниками наследства являются F, C и G.
**Function prototype:** void FillSuccessorNodes( struct node *root);
Нам дан корневой узел дерева, и нам нужно заполнить указатель преемника для всех узлов.
случай 1) некоторые из указателей-преемников могут быть NULL . В этом случае вы должны заполнить этот указатель немедленным преемником Inorder.
Пример: если A-> Successor == NULL, тогда заполните A-> Successor = F
вариант 2) некоторые указатели наследника могут уже указывать на правильных наследников. В этом случае вам не нужно изменять указатели-преемники.
Пример: 1) A-> successor = F действителен
2) A->successor = C is valid
3) A-successor = G is valid . All these three cases you no need to modify successor pointer since these already pointing to correct successor nodes.
case 3) Некоторые из указателей преемника не NULL , но эти указатели указывают на преемников INVALID, т. Е. Это может быть преемник неупорядоченного значения или какое-либо значение мусора. В этом случае вы должны заполнить эти узлы непосредственными преемниками.
Пример: * * тысяча двадцать-восемь
1) A->successor = B is invalid since B is not successor node , so we have to correct it to A->successor = F.
2) A->successor = 0x23237463478 is invalid since it is pointing to garbage value. So we we have to correct it to A->successor = F.
1) Интервьюер спросил меня, эффективное время в O (N) времени сложности. Допускается дополнительное пространство.
2) она дала намек, то есть мы можем использовать HASHing.
Если вы знаете решение этой проблемы, пожалуйста, дайте мне знать.