Форум программистов, компьютерный форум CyberForum.ru

Ошибка с построением бинарного дерева - C++

Восстановить пароль Регистрация
 
mgrek
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 2
31.05.2013, 20:42     Ошибка с построением бинарного дерева #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class Node
{   
public:
    Node *left,*right,*prev;
    dnf key;                                                                                    //Это матрица представляет ДНФ, где число строк  n=30, оно уменьшается, m=25 число столбцов не меняется кол-во, изменяются данные внутри
    int z;                                                                                        //Номер изменившегося столбца
    Node(dnf k,int v=NULL, Node *l=NULL,Node*r=NULL,Node*p=NULL){
        key=k;
        z=v;
        left=l;
        right=r;
        prev=p;
    }
    friend class BTree;
};
class BTree
{
    Node*root;
public:
    BTree(){root=NULL;}
    BTree(Node* T){root=T;}
    ~BTree(){del_tree(root);root=0;}
    void add(Node*,dnf);
    int Height(Node*);
    Node*Add(Node*,dnf);
 
};
void BTree::add(Node* t, dnf k)
{
    t->prev=NULL;
    char f[25]={"------------------------"};                 //создаем строку, которая затем будет менять матрицу
    dnf t1,t0;                                                           //они хранят исходную матрицу, с измененным значением, где t0 хранит изменение на 0, а t1 хранит изменение на 0
    dnf L(2,25);                                                        //это матрица из 2х строк, где 1ая строка это будет "---0---", а 2ая строка "---1----"
    int s=k.max();                                                     //ищем номер столбца максимально встречающегося элемента в столбце
    L.perem(f,s);                                                      //ставим на эти места 0 и 1, в 1ой и 2ой строчке
    t1=k;
    t0=k;
    t1.zam(L[1]);                                                    //меняем столбец на 1, и удаляем лишнии 
    t0.zam(L[0]);                                                    //меняем на 0, удаляем лишний
    t->left=Add(t,t0);
    t->right=Add(t,t1);
}
Node*BTree::Add(Node *t, dnf k)
{
    char f[25]={"------------------------"};                           //создаем строку, которая затем будет менять матрицу
    dnf tp,t1,t0;                                                                 //они хранят исходную матрицу, с измененным значением, где t0 хранит изменение на 0, а t1 хранит изменение на 0, tp исходная матрица
    t1=k;
    t0=k;
    tp=k;
    if(k.zero()){                                                                   //если в матрице остается одна строка из "---"
        t->z=0;
        t->left=NULL;
        t->right=NULL;
        return t;
    }
    if(k.one()){                                                                   //если остается одна строка, где один из элементов 1 или 0
        int *a;
        a=k.position();                                                       //находим его 
        dnf p;
        p=k;
        if(p.symb(a[0],a[1])=='1'){                                       //если 1,то оставляем его и выходим
            t->left=NULL;
            t->right=NULL;
            t->z=1;
            return t;
        }
        else{                                                                    //если 0, то создаем еще 2 ветки, где одна будет состоять из "----", а 2ая содержать 1 вместо 0
            Node*p;
            p=new Node(k,a[1]);
            p->prev=t;
            t=p;
            dnf pr(2,25);
            pr.perem(f,a[1]);
            t0.zam(pr[0]);
            t1.zam(pr[1]);
            t->z=a[1];
            t->left=Add(t,t0);
            t->right=Add(t,t1);
        }
        return t;
    }                                                           //здесь если в матрице строк >1, то создаем новые ветки
    int s=k.max();                                             //ищем номер столбца максимально встречающегося элемента
    Node*p;
    p=new Node(k,s);
    p->prev=t;
    t=p;
    t->key=tp;
    dnf pr(2,25);                                             //ставим на эти места 0 и 1, в 1ой и 2ой строчке  
    pr.perem(f,s);                                              
    t0.zam(pr[0]);                                           //меняем столбец на 0, и удаляем лишнии строки, где они состоят из "--"
    t->z=s;
    t->left=Add(t,t0);
    t1.zam(pr[1]);                                            //меняем столбец на 0, и удаляем лишнии строки, где они состоят из "--"
    t->right=Add(t,t1);
    return t;
}
Ошибка с рекурсией, теряет значение t0 и t1, проходя до конца левой ветки в последней функции, не могу понять как реализовать это построение бинарного дерева, чтобы каждая вершина строилась меняясь внутри...

Полный код вложен внутри.... Извините, без комментариев....
Вложения
Тип файла: rar temp.rar (2.6 Кб, 1 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2013, 20:42     Ошибка с построением бинарного дерева
Посмотрите здесь:

Прошивка бинарного дерева на С++ C++
Копирование бинарного дерева C++
C++ Построение бинарного дерева на основе не бинарного
C++ Вывод бинарного дерева на экран в виде "дерева"
C++ Построение бинарного дерева. Где ошибка?
Написать шаблон бинарного дерева с функцией распечатки дерева C++
C++ Запись бинарного дерева
Ошибка при реализации бинарного дерева: error C1075: конец файла обнаружен ранее, чем левая фигурная скобка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 08:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru