Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 24.05.2009, 16:03   #1 (permalink)
Маньяк
Новичок
 
Регистрация: 24.05.2009
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Бинарное дерево на С

Помогите пожалуйста сделать Бинарное дерево на языке С, под компилятор Dev_cpp в бинарное дерево надо только добавлять значения. Заранее спасибо!
Маньяк вне форума   Ответить с цитированием

Старый 24.05.2009, 16:03
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Давайте я вам помогу найти схожие с вашей темы

Перевод картинки с бумаги на металл, дерево
Нужно построить бинарное дерево
Стилизация под обгоревшее дерево
Бинарное дерево.
Дерево

Старый 25.05.2009, 23:28   #2 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Так, а бинарное дерево - в смысле обычное int'овое когда сравнивается с уже существующими числами и в зависимости от этого кладётся куда-либо, или же там просто какие-то данные в каждом элементе хранятся(если да, то какие)?
csbwalker вне форума   Ответить с цитированием
Старый 26.05.2009, 00:18   #3 (permalink)
Маньяк
Новичок
 
Регистрация: 24.05.2009
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

ну к примеру первое число 10, то 9 запишется в левую часть, а 11 в правую
Маньяк вне форума   Ответить с цитированием
Старый 26.05.2009, 00:19   #4 (permalink)
Маньяк
Новичок
 
Регистрация: 24.05.2009
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Да да сравнивается с уже существующими числами.
Маньяк вне форума   Ответить с цитированием
Старый 26.05.2009, 11:55   #5 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
Lightbulb

Код:
#include <stdio.h>
#include <stdlib.h>

struct treeNode
{
    int value;
    
    struct treeNode *left;
    struct treeNode *right;
};

/* Функция, создающая ветвь дерева и устанавливающая значения её параметров */
struct treeNode *treeCreate(int n)
{
struct treeNode *nel;
    /* Выделяем память для ветви */
    nel = malloc(sizeof(struct treeNode));
    
    /* Если удалось выделить - записываем туда значения параметров */
    if(nel != NULL)
    {
        nel->left = NULL;
        nel->right = NULL;
        nel->value = n;
    }
    
    /* Возвращаем адрес созданной ветви (или NULL если создать не удалось) */
    return nel;
}

/* Рекурсивная функция, которая добавляет ветвь в дерево */
void treeAdd(struct treeNode *root, int n)
{
    /* Определяем, в какую ветвь нужно добавить число - в левую или правую */
    if(n <= root->value)
    {
        /* Если в левую */
        /* Если левой ветви нет - создаём её и записываем в ней число,
           иначе - продолжаем рекурсию с неё */
        if(root->left == NULL)
            root->left = treeCreate(n);
        else
            treeAdd(root->left, n);
    } else
    {
        /* Если в правую - действия аналогичны левой */
        if(root->right == NULL)
            root->right = treeCreate(n);
        else
            treeAdd(root->right, n);
        
    }
}

/* Рекурсивная функция, выводящая ветви дерева на экран */
void treeNodePrint(struct treeNode *root, int m, char ch)
{
int i;
    /* Если указатель ревен нулю - конец рекурсии, если нет - выполняем вывод */
    if(root != NULL)
    {
        /* Выводим отступ */
        for(i = 0; i < m; i++)
            putchar(' ');
            
        /* Выводим значение текущего элемента */
        printf("|-%c: %d\n", ch, root->value);
        
        /* Запускаем рекурсивный вывод для левой, а затем для правой ветвей */
        treeNodePrint(root->left, m + 2, 'L');
        treeNodePrint(root->right, m + 2, 'R');
    }
}

/* Функция, выводящая всё дерево на экран */
void treePrint(struct treeNode *root)
{
int i;
    /* Печатаем верхний разделитель */
    for(i = 0; i < 20; i++)
        putchar('-');
    putchar('\n');
    
    /* Печатаем дерево начиная с корня */
    treeNodePrint(root, 0, 'T');

    /* Печатаем нижний разделитель */
    for(i = 0; i < 20; i++)
        putchar('-');
    putchar('\n');
}

/* Функция запроса дальнейших действий */
int ask()
{
int d;
    printf("What we should to do?\n");
    printf("0. exit;\n");
    printf("1. print tree;\n");
    printf("2. add new node.\n");
    printf("Please, enter answer: ");
    scanf("%d", &d);

    return d;
}

int main()
{
struct treeNode *root;
int n;
    /* Запрашиваем значение корня */
    printf("Enter value of root: ");
    scanf("%d", &n);
    /* Создаём корень */
    root = treeCreate(n);
    /* Если не удалось создать корень - выходим */
    if(root == NULL) 
    {
        printf("Error!");
        return 1;
    }
    
    /* Бесконечный цикл с запросом и выполнением действий */
    while(1)
    {
        switch(ask())
        {
            case 1:
                treePrint(root);
                break;
            
            case 2:
                printf("Enter value to add: ");
                scanf("%d", &n);
                treeAdd(root, n);
                break;
            
            default:
                return 0;
            
        }
    }
}
Вот, тут все элементы хранят числа типа int.
Реализована операция добавления и вывод дерева на экран, что бы посмотреть правильность выполнения операции добавления.
Вродь всё!
csbwalker вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 26.05.2009, 13:34   #6 (permalink)
Маньяк
Новичок
 
Регистрация: 24.05.2009
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое!
Маньяк вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 22:59.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.