Вот определение узла:
struct node{
int data;
stuct node * left;
struct node * right;
};
То, что я пытаюсь сделать, это перечислить все узлы, которые указывают на узел предка. После публикации неправильного решения и получения рекомендаций из ответов, мое новое решение:
Рекурсивно пройти через двоичное дерево. Добавьте текущий узел в массив узлов и затем проверьте, указывают ли дочерние элементы текущего узла на любой из предыдущих узлов-предков.
Случай по умолчанию - это NULL. Если это произойдет, функция вернется.
Как это должно работать:
Добавляет узел в массив
Проверяет, равен ли левый ребенок NULL.
Если нет, он сравнивает дочерний элемент с каждым из предыдущих узлов.
Если он находит ошибку, он сообщает об этом.
Если нет, то она вызывает функцию с дочерним элементом в качестве аргумента.
Повторяйте, пока не закончите.
(То же самое для правой части двоичного дерева)
Вопросы:
- Лучше всего хранить массив
узлы?
- Это работает? для (i = 0; i
- Поскольку функция рекурсивная,
массив и индекс массива не могут
инициализироваться внутри функции
(или они могут быть?)
глобальный?
- Было бы лучше иметь два массива?
(один для LHS и один для
RHS)
код:
void findFault(node * root){
if (root == NULL){
return;
}
arrOfNodes[index++] == root; // array of nodes
if (root->left != NULL){
for (i = 0; i < sizeof(arrOfNodes) / sizeof(node); i++){
if (ar[i] == root->left){
printf("%d", root->left);
return;
}
}
findFault(root->left);
} else return;
if (root->right != NULL){
for (i = 0; i < sizeof(ar) / sizeof(node); i++){
if (ar[i] == root->right){
printf("%d", root->right);
return;
}
}
findFault(root->right);
} else return;
}