https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/
В этой статье рассматриваются 3 простых подхода, основанных на глубине (предварительный порядок, порядок, последующий порядок) для обхода двоичного дерева. У этого также есть хороший компактный пример в C.
Алгоритм псевдокода, который вы предоставили, на самом деле является правильным подходом предварительного заказа.
Единственная модификация, которую вы должны сделать в
void printPreorder(struct node* node)
метод заключается в замене печати данных узла:
printf("%d ", node->data);
проверкой, является ли узел листом, и, если да, добавлением это к списку:
if((node->left == NULL) && (node->right == NULL))
{
appendList(&node);
}
Конечно appendList
- это просто мое ad-ho c создание, но на основе кода, который вы предоставили в вопросе, вы будете знать, как добавить к связанный список. Если нет, пожалуйста, не стесняйтесь спрашивать.
ps: https://www.geeksforgeeks.org/ - это потрясающий ресурс для тех ребят, которые за потрясающую работу!
psps: Если вы ' Я хотел бы вернуть сообщение об ошибке, когда функция вызывается с NULL в первый раз, то есть, если в обход не передано действительное дерево, я бы предложил вам создать функцию-обертку, которая будет вызывать рекурсивную. Затем в этой оболочке вы можете проверить, равна ли переданная ему голова NULL, прежде чем вы вообще вызовете рекурсивный метод.