#c
#c
Вопрос:
у меня есть обучающее дерево:
typedef struct Trin_Ari {
int id;
char* name;
struct Trin_Ari *parent;
struct Trin_Ari *left;
struct Trin_Ari *middle;
struct Trin_Ari *right;
}Trin_Ari;
у меня есть участники в таком порядке:
и мне нужно распечатать их таким образом:
A1
B2
D4
G7
C3
E5
F6
H8
I9
Комментарии:
1. Примечание: на чертеже отсутствуют узлы
G, H, I
.2. Вы спрашиваете конкретно о троичных деревьях. Знаете ли вы о том, как это делать в двоичных деревьях? С каким препятствием вы сталкиваетесь при попытке. Я спрашиваю, потому что ваш вопрос не демонстрирует никаких собственных усилий и, похоже, просто запрашивает код. Также неясно, какой уровень детализации вам нужен, с нуля, кажется, из-за того, что ничего не демонстрирует, но заголовок явно фокусируется на троичных деревьях….
Ответ №1:
Обход дерева порядка уровней.
- начните с корневого узла
- для каждого узла
- печать данных узла
- поместите дочерние элементы (если они есть) в очередь (в очередь — слева направо)
- возьмите следующий элемент из очереди (удаление из очереди)
Пример кода:
// for test purpose
#define MAX_NODES 32
static struct {
int head, tail;
Trin_Ari* data[MAX_NODES]; // or allocate at runtime
} queue;
static void reset_queue()
{
queue.head = queue.tail = 0;
memset(queue.data, 0, sizeof(Trin_Ari*) * MAX_NODES);
}
static void enqueue(Trin_Ari *node)
{
queue.data[queue.tail ] = node;
}
static Trin_Ari* dequeue()
{
return queue.data[queue.head ];
}
void print(Trin_Ari *root)
{
Trin_Ari *node = root;
reset_queue();
while (node) {
// print node data
printf("%i, %sn", node->id, node->name);
// enqueue child nodes
if (node->left) enqueue(node->left);
if (node->middle) enqueue(node->middle);
if (node->right) enqueue(node->right);
// dequeue a node from the queue
node = dequeue();
}
}
Для дерева:
A
/ |
B C D
/ | / | / |
E F G H I J K L M
1. Итерация
- печать: A
- очередь: B C D // в очереди
- узел: B // удален из очереди
2. Итерация
- печать: B
- очередь: B C D E F G
- узел: C
3. Итерация
- печать: C
- очередь: B C D E F G H I J
- узел: D
4. Итерация
- печать: D
- очередь: B C D E F G H I J K L M
- узел: E
5. Итерация
- печать: E
- очередь: B C D E F G H I J K L M //<- без изменений, поскольку E..M являются листьями (без дочерних элементов)
- узел: F
Итерация будет продолжаться до узла M (последнего элемента в очереди).