SVK wrote:Наличие ссылки *parent
ааааа. я эту ссылку не заметил и начал разговоры разговаривать м-да.
![Embarassed :oops:](./images/smilies/icon_redface.gif)
SVK wrote:Посмотрел еще раз - все могу повторить то же самое. Главное - цикл бесконечный на 4-5-4-5-4-5-4-5-4-5-.... (ну, вижу я это без компьютера), не считая также не вполне правильных промежуточных результатов. То есть, алгоритм не выдает конечного результата вообще. У нас в школе с этим было строго: нет результата - оценка -1...
olg2002 wrote:Не пожалейте времени, напишите программу.
Code: Select all
cur---statement
. . . . . . . . . . . начало пропущено до момента cur=4
4-----while ( cur ) {
4-----process( cur );
4-----if ( cur->child ) {
4-----cur = cur->child;
5-----continue;
5-----while ( cur ) {
5-----process( cur );
5-----if ( cur->child ) {
5-----}
5-----while ( cur ) {
5-----if ( cur->next ) {
5-----}
5-----cur = cur->parent;
4-----}
4-----while ( cur ) {
4-----process( cur );
4-----if ( cur->child ) {
4-----cur = cur->child;
5-----continue;
5-----while ( cur ) {
5-----process( cur );
5-----if ( cur->child ) {
5-----}
5-----while ( cur ) {
5-----if ( cur->next ) {
5-----}
5-----cur = cur->parent;
4-----}
. . . . . . и т.д., пока хватит сил....
SVK wrote:Посмотрел еще раз - все могу повторить то же самое. Главное - цикл бесконечный на 4-5-4-5-4-5-4-5-4-5-.... (ну, вижу я это без компьютера ...
Code: Select all
Node *cur=root;
while ( cur ) {
process( cur );
if ( cur->child ) {
cur = cur->child;
continue;
}
while ( cur && cur != root ) {
if ( cur->next ) {
cur = cur->next;
break;
}
cur = cur->parent;
}
if (cur == root) break;
}
Code: Select all
#include <stdio.h>
typedef struct Node Node;
struct Node {
Node *next;
Node *child;
Node *parent;
int key;
};
Node nd2, nd3, nd4, nd5, nd6, nd7, nd8, nd9, nd10, nd11, nd12, nd13;
Node nd1 = { NULL, &nd2, NULL, 1 };
Node nd2 = { &nd6, &nd3, &nd1, 2 };
Node nd3 = { &nd7, &nd4, &nd2, 3 };
Node nd4 = { &nd8, &nd5, &nd3, 4 };
Node nd5 = { NULL, NULL, &nd4, 5 };
Node nd6 = { &nd9, NULL, &nd1, 6 };
Node nd7 = { NULL, NULL, &nd2, 7 };
Node nd8 = { &nd10, NULL, &nd3, 8 };
Node nd9 = { NULL, NULL, &nd1, 9 };
Node nd10 = { NULL, &nd11, &nd3, 10 };
Node nd11 = { &nd13, &nd12, &nd10, 11 };
Node nd12 = { NULL, NULL, &nd11, 12 };
Node nd13 = { NULL, NULL, &nd10, 13 };
Node *root = &nd1;
void
process( Node *nd )
{
printf("%d\n", nd->key );
}
int
main()
{
Node *cur=root;
while ( cur ) {
process( cur );
if ( cur->child ) {
cur = cur->child;
continue;
}
while ( cur ) {
if ( cur->next ) {
cur = cur->next;
break;
}
cur = cur->parent;
}
}
return 0;
}
SVK wrote:olg2002 wrote:Не пожалейте времени, напишите программу.
Трассировка:Code: Select all
cur---statement
. . . . . . . . . . . начало пропущено до момента cur=4
4-----while ( cur ) {
4-----process( cur );
4-----if ( cur->child ) {
4-----cur = cur->child;
5-----continue;
5-----while ( cur ) {
5-----process( cur );
5-----if ( cur->child ) {
5-----}
5-----while ( cur ) {
5-----if ( cur->next ) {
5-----}
5-----cur = cur->parent;
4-----}
4-----while ( cur ) {
4-----process( cur );
4-----if ( cur->child ) {
4-----cur = cur->child;
5-----continue;
5-----while ( cur ) {
5-----process( cur );
5-----if ( cur->child ) {
5-----}
5-----while ( cur ) {
5-----if ( cur->next ) {
5-----}
5-----cur = cur->parent;
4-----}
. . . . . . и т.д., пока хватит сил....
Ну, не надо еще с анекдотами путаться...
Code: Select all
...............................
cur=4
4-----while ( cur ) {
4-----process( cur );
4-----if ( cur->child ) {
4-----cur = cur->child;
5-----continue;
5-----while ( cur ) {
5-----process( cur );
5-----if ( cur->child ) {
5-----}
5-----while ( cur ) {
5-----if ( cur->next ) {
5-----}
5-----cur = cur->parent;
4-----}
4-----while ( cur ) {
4-----if ( cur->next ) {
8-----cur = cur->next;
8-----break;
8-----while ( cur )
8-----process(cur)
........... etc ........
tengiz wrote:Так что если это не специальный частный случай, то задача на самом слегка надумана. Специальный случай, это, скажем, когда нужно иметь возможность readonly обходить дерево одновременно и параллельно несколькими потоками, поэтому вместо дополнительного стека для каждого потокам может оказаться выгоднее иметь parent указатель в каждом узле.
SVK wrote:Не только для такого случая. Некоторые виды обработки могут требовать просто "подъема" начиная с нижних уровней дерева к верхним. Для такого типа проходов указатели parent все равно нужны. А коли они уже есть в структуре (а по условию дано, что они все-таки есть), то грех не использовать их, а строить стек даже и при стандартном обходе дерева.
Не так разве?
tengiz wrote:что Вы имеете в виду под подъёмом начиная с нижних уровней (с чего в этом случае начинается обход - со списка внешних узлов, т.е. самого нижнего уровня?).
tengiz wrote:A. Fig Lee - а как обходить дерево в условии задачи не задано? Приведённый нерекурсивный алгоритм обходит эту структуру вполне определённым образом. Любой другой обход потребует дополнительной памяти либо в виде стека для рекурсии, либо в виде программного стека/очереди.
.