Нужна помощь с кодом печати дерева - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь напечатать это дерево:

    1 
   / \
  2   3
 /   / \
4   5   6

Таким образом:

1
2 3
4 5 6

Я написал этот код:

void print_g(Tree t)
{
    Queue q=initQueue();
    Tree tmp=initTree();
    if(!isTreeEmpty(t))
        enqueue(q,t);
    while(!isQueueEmpty(q))
    {
        tmp=dequeue(q);
        printf("%d ",*((int *)Root(tmp)));
        if(!isTreeEmpty(subLeft(tmp)))
            enqueue(q,subLeft(tmp));
        if(!isTreeEmpty(subRight(tmp)))
            enqueue(q,subRight(tmp));

    }
}

Но этот кодпечатается так:

123456

Не могу придумать, как решить проблему с печатью.Может кто-нибудь написать псевдокод ??

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

После добавления дочерних элементов в очередь создайте поддельный узел дерева со значением, являющимся символом новой строки, и добавьте его в очередь.

0 голосов
/ 08 сентября 2011

У вас нет кода для печати новой строки ('\ n') после каждого поколения дерева.

Вам нужно найти способ сообщить программе, когда проходит поколение дерева, а затемвставьте туда «\ n».

Возможно:

void print_g(Tree t)
{
    Queue q=initQueue();
    Tree tmp=initTree();
    if(!isTreeEmpty(t))
        enqueue(q,t);

    int dist = distanceFromTop(t); // new function to tell us which generation we are in

    while(!isQueueEmpty(q))
    {
        tmp=dequeue(q);

        if (distanceFromTop(tmp) != dist) // have we changed generation from previous iteration?
            printf("\n"); // if so, newline
        dist = distanceFromTop(tmp);

        printf("%d ",*((int *)Root(tmp)));
        if(!isTreeEmpty(subLeft(tmp)))
            enqueue(q,subLeft(tmp));
        if(!isTreeEmpty(subRight(tmp)))
            enqueue(q,subRight(tmp));

    }
}

Просто убедитесь, что в вашем определении Tree есть член для хранения своего собственного distanceFromTop и заполните это значение во время initTree(), чтобы алгоритм не стал слишком медленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...