Нисходящий обход дерева

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Zabrodin1991
Сообщения: 1
Зарегистрирован: 20 май 2010, 01:49

Здравствуйте люди добрые, срочно требуеться помощь с обходом дерева. нужен нисходящий обход. Корень-левыйсын-правыйсын, надеюсь на вашу помощь, сам пытался както рекурсивно решить ету проблему, но чттото ничего не получилось(
вот построение самого дерева

Код: Выделить всё

#include <iostream>
#include <conio.h>
#include <stdio.h>
typedef struct tree {
	int number; // номер узла
	int info; // инфо часть узла
	int ChildCount; // количество детей узла
	tree* Children; // указатель на массив детей
} tree;

int nodecount = 1;
int count = 0;
tree current, temp;

void filltree(tree* node)
{
	int child;
	node->number = nodecount++;
	printf("you are in the top number %d!\nEnter info part :", node->number);
	scanf("%d", &node->info);
	
	printf("Enter amount of children : ");
	scanf("%d", &child);
	
	if (child > 0){
		node->ChildCount = child;
		node->Children = new tree[child];
		for (int i = 0; i < child; ++i){
			filltree(&node->Children[i]);
		}
	} else {
		node->ChildCount = 0;
		node->Children = NULL;
	}
}

void releasetree(tree* node){
	if (node->ChildCount > 0){
		for (int i = 0; i < node->ChildCount; ++i){
			releasetree(&node->Children[i]);
		}
		delete [] node->Children;
	}
}

void detour (tree* node){
здесь у меня глухо(
}


void menuprint(void) {
	printf("1. Make tree\n");
	printf("2. Detour\n");
	printf("3. Exit\n");
}

void menuwork(tree* node) {
	char c;

	while (c != 3) {
		system("cls");
		menuprint();
		c = getch();
		switch (c) {
			case '1' : 	printf("Warning!!! enter only one number at one point!\n");
						filltree(node);
						printf("Successful!!!\n");
						getch();
						break;
			case '2' : detour(node);break;
			case '3' : ;return;
		}
	}
}


void main(void){
	tree node;

	menuwork(&node);
	releasetree(&node);

}
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

Решение весьма просто и изящно. :)
Что касательно бинарных деревьев имеем.
Примерный код:

Код: Выделить всё

void traverse(TreeNode *ptr)
{
    if(ptr != 0)
    {
        doSomthingWithNode(ptr);/*  выполнить действие над узлом(вывести на печать, подсчитать и т.д.) */
        traverse(ptr->left);
        traverse(ptr->right);
    }
}
Данная рекурсивная функция принимает в качестве аргумента указатель на узел дерева
и будет вызывать функцию doSomthingWithNode для каждого из узлов дерева.
Приведенная функция реализует прямой обход (сверху вниз);
Если поместить обращение к doSomthingWithNode между рекурсивными вызовами, получится поперечный обход;
А если поместить обращение к doSomthingWithNode после рекурсивных вызовов - то обратный обход.

Что же касается твоего примера, то немного раскинув мозгами (по клаве) или посмотрев теорию в книге (1)
можно легко реализовать функцию для твоего дерева общего вида.

Дерзай. :)

Материалы по теме:
1) Ахо, Хопкофт, Ульман "Структуры данных и алгоритмы" (2000 г.) глава 3. - хорошая теория по деревьям.
2) Сэджвик "Фундаментальные алгоритмы ч1-4" глава 5.4. - осторожно! много теории, берегите мозги :)
3) Дайтелы "Как программировать на С++" глава 15.7.
4) Карано "Абстракция данных и решение задач на С++. Стены и зеркала" глава 10. - как по мне хорошие объяснения и наглядные примеры.
Ответить