Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Создание бинарного дерева


Автор: xStorm 22.11.2007, 16:33
Помогите дорешать задачу, только начинаю знакомиться с деревьями, поэтому не совсем понимаю как их правильно конструировать.
0 10
 00 20
  001 30
 01 5
  010 6
  011 7
   0110 100
   0111 0
- Вот допустим мне дан такой файл 0 - корень со значением 10. 00 - левый сын. 01 - правый сын итд. Мне нужно что бы вы помогли мне правильно сконструировать дерево в памяти, сцепить все веточки. Я уже немного продвинулся, моя программа уже считывает индексы и данные. Осталось только дерево сконструировать из данных.
Код

// Lab2C.cpp
#include "stdafx.h"
#include "string.h"
#include "ctype.h"
#define maxline 40

//Структура, опиисывающая элемент дерева.
typedef struct STree{ 
    int data;
    char indicator[maxline];
    struct Tree *Left, *Right;
};

class CTree
{
private:
    STree* Root; //Указатель на корень дерева
    FILE *infile;
    char string[maxline];
    char StringValue[maxline];
    char indicator[maxline];
public:
    int BuildTree ();
    //void CleanTree ();

};

int CTree::BuildTree()
{
    STree *pTree;
    int Value;
    int i, j;

    if((infile=fopen("indata.txt","rt"))!=NULL)
    {
        while(fgets(string, maxline, infile)!=NULL)
        {
            //Узнаем данные и индикатор строки
            i=0; j=0;
            while(string[i]==' ' || string[i]=='\t')
            {
                i++;
            }
            if(string[i]=='0' || string[i]=='1')
            {
                do{
                    indicator[j]=string[i]; //indicator
                    j++;
                    i++;
                }while(string[i]=='0' || string[i]=='1');
            }
            j=0;
            while(string[i]==' ' || string[i]=='\t')
            {
                i++;
            }
            if(string[i]>='0' && string[i]<='9')
            {
                do{
                    StringValue[j]=string[i];
                    i++;
                    j++;
                }while(string[i]>='0' && string[i]<='9');
            }
            i=0; j=0;
          Value=atoi(StringValue);
            //Создаем дерево если оно не создано или добавляем потомков 
            if(Root==NULL)
            {
                Root = new STree;
                Root->indicator[0]='0';
                Root->data=Value;
                Root->Left=NULL;
                Root->Right=NULL;
            }else
            {
                pTree = new STree;

                
                i=0;
                while(indicator[i]=='1' || indicator[i]=='0')
                {
                    pTree->indicator[i]=indicator[i];
                    i++;
                }
                pTree->data=Value;
                pTree->Left=NULL;
                pTree->Right=NULL;
//ПОИСК ПО ДЕРЕВУ СО ВСТАВКОЙ ЭЛЕМЕНТА (ПОМОГИТЕ ОСУЩЕСТВИТЬ)
//Не получается что-то состыковать элементы дерева правильно. Помогите, по идее там
//небольшая функция должна быть.
            }
            puts(string);
        }
        return 0;
    }else
    {
        return -1;
    }
}

void main()
{
    CTree Tree;
    if(Tree.BuildTree()==0)
    {
        puts("File opened successfully");
    }else
    {
        puts("Can't open file: Invalid data, or file is not exist");
        
    }
    getch();
}

Автор: GIK 23.11.2007, 10:33
Цитата

10. 00 - левый сын. 01 - правый сын итд

т.е. ты хочешь сказать что это:  0 10 есть 01 и 10 то есть разделение какое то?

Автор: xStorm 26.11.2007, 15:25
Да. Сначала идет код элемента, потом его данные. Вот я постарался нарисовать

                                            О  (0)
                                          /    \
                                (00) О       О (01)
                                      /   \
                          (000) О      О (001)

(просто пример) Если элемент добавляется справа то к строке дописывается 1, если слева то 0.

0 - код конря
0 10 - значит корень со значением 10.
00 20 - значит левый сын корня со значением 20.

(ПОМОЩЬ БОЛЬШЕ НЕ НУЖНА. НАШЕЛ ЧЕЛОВЕКА КОТОРЫЙ СМОГ ПОМОЧЬ)

Автор: GIK 27.11.2007, 13:41
Прикольная логика, мне нравиться  smile 
Скинь код глянуть, если можно? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)