Как создать не рекурсивную функцию для печати двоичного дерева?

Добрейший вечерочек форумчанам.

На повестке дня вот такая задачка:

  1. С файла считывать последовательность координат (x, y, z) пространственных точек, упорядоченных за отдаленностью от точки начала координат (разработать отдельную функцию для вычисления расстояния и сохранять это значение в структуре данных);
  2. Для обхода использовать нижний вариант справа налево;
  3. Извлечь из дерева все узлы, кордината z которых попадает в заданный диапазон zmin ..zmax и указать их количество;
  4. Для полного стирания дерева использовать прямой (от корня) вариант обхода слева направо;
  5. Напечатать всё дерево с помощью не рекурсивной функции.

Вот то что уже успел сделать. Все работает шикарно, но вот вариант распечатки дерева у меня рекурсивный. По этому прошу помощи с реализацией не рекурсивной функции распечатки, желательно с объяснением.

И по мере возможности подскажите как можно реализовать 3 пункт.

Заранее спасибо всем кто откликнется;)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_LEN 8

typedef struct Tree {
    int viddal;
    struct Tree* left, * right;
} TREE;

int Distance(FILE* ftxt);
int CreateTreeFromFile(void);
TREE* NewNode(FILE* f, int min);
void AddNewNode(TREE* pnew, int min);
void PrintTreeNIZ(TREE* proot);
void OutputTreeStructure(const char* title);
void ShowTree(TREE* proot, int level);

TREE* root;

int main(){

    system("chcp 1251");
    if (CreateTreeFromFile() == 0)
        return 0;

    puts("\n\t Сформированное дерево (нижний обход): ");
    PrintTreeNIZ(root);

    OutputTreeStructure("сформированного дерева");

    return 0;
}

int Distance(FILE* ftxt) {

    if (feof(ftxt)) {;
        return NULL;
    }
    else {

        int x, y, z;
        fscanf(ftxt, "%d%d%d", &x, &y, &z);

        int viddal = sqrt(x * x + y * y + z * z);

        return viddal;
    }
}

int CreateTreeFromFile()
{
    const char* fname = "Cords_1.txt";
    FILE* fvoc = fopen(fname, "r");

    if (fvoc == NULL) {
        printf("\n\t\tНе удалось открыть файл данных %s...\n", fname);
        return 0;
    }

    TREE* node;
    int min = Distance(fvoc);

    while ((node = NewNode(fvoc, min)) != NULL) {
        AddNewNode(node, min);
        min = Distance(fvoc);
    }
    fclose(fvoc);
    return 1;
}

TREE* NewNode(FILE* f, int min) 
{
    TREE* pel;
    pel = (TREE*)malloc(sizeof(TREE));

    if (feof(f)) {
        return NULL;
    }

    pel->viddal = min;

    pel->left = pel->right = NULL;
    return pel;
}

void AddNewNode(TREE* pnew, int min) {

    if (root == NULL) {
        root = pnew;
        return;
    }

    TREE* prnt = root;

    do {
        if (pnew->viddal == prnt->viddal) {
            free(pnew);
            return;
        }

        if (pnew->viddal < prnt->viddal) {
            if (prnt->left == NULL) {
                prnt->left = pnew;
                return;
            }
            else
                prnt = prnt->left;
        }
        else {
            if (prnt->right == NULL) {
                prnt->right = pnew;
                return;
            }
            else
                prnt = prnt->right;
        }
    } while (1);
}

void PrintTreeNIZ(TREE* proot)
{
    if (proot == NULL)
        return;
    static int n = 1;
    PrintTreeNIZ(proot->right);
    PrintTreeNIZ(proot->left);
    printf("\n %3d -> %d", n++, proot->viddal);
}

void OutputTreeStructure(const char* title)
{
    printf("\n\n\n\t Структура %s:\n\n", title);
    ShowTree(root, 0);
    puts("\n\n");
}
#define TAB 7

void ShowTree(TREE* proot, int level)
{
    if (proot == NULL) return;
    ShowTree(proot->right, level + 1);
    printf("\n%*c%d", level * TAB + 10, ' ', proot->viddal);
    ShowTree(proot->left, level + 1);
}

Данные для текстового файла:

13 14 15
13 14 15
16 14 18
10 11 12
4 5 6
16 17 18
14 13 21
17 13 14
12 12 14
13 13 14
11 13 12
10 12 4
4 5 2
5 6 7
17 14 15
22 13 21

Ответы (0 шт):