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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
v1perokk
Сообщений: n/a
#1

Массив из чисел представить в виде упорядоченного бинарного дерева - C++

26.06.2014, 13:54. Просмотров 407. Ответов 0
Метки нет (Все метки)

Помогите пожалуйста.Массив из чисел представить в виде упорядоченного бинарного дерева. Вывести на экран дерево и все его ветви, исходящие из слоя с заданным ключом. Сделать сделал, но дерево выводится очень криво и только в Visual Studio... Если возможно, то помогите правильно и красиво его вывести. А кто умеет сделать это же в C++ Builder'е. Заранее БОЛЬШОЕ СПАСИБО!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "sequnce.h"
#include <conio.h>
int main(){
    //sequnce first(int(15));
    //first.serch_int(1);
    char exit;
    do{
        std::string input_str;
        std::cout << "Enter numeric number" << std::endl;
        int num;
        std::cin >> num;
        sequnce first(num);
        system("cls");
        std::cout << "Enter number" << std::endl << std::endl << std::endl << std::endl;
        int number;
        std::cin >> number;
        system("cls");
        first.serch_int(number);
        exit = _getch();
        system("cls");
    } while (exit != 'ESC');
    _getch();
}
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "tree.h"
 
 
tree::tree()
{
    root = NULL;
    first = true;
    size = 0;
    hight_temp_is = true;
    hight_temp = 0;
    hight = 0;
    
}
 
 
tree::~tree()
{
}
 
void tree::add(int& d , node** uz){
    if (*uz == NULL){
        *uz = new node;
        (*uz)->data = d;
        (*uz)->num = 1;
        (*uz)->left = (*uz)->right = NULL;
        (*uz)->NUM_pod_this = 0;
        size++;
        if (hight_temp_is)(*uz)->h = hight_temp + 1;
        hight_temp_is = false;
    }
    else{
        if (d > (*uz)->data)
        {
            hight_temp = (*uz)->h;
            hight_temp_is = true;
            add(d, &((*uz)->right)); //Если аргумент а больше чем текущий элемент, кладем его вправо
        }
        else if (d < (*uz)->data)//Если меньше кладем его влево
        {
            hight_temp = (*uz)->h + 1;
            hight_temp_is = true;
            add(d, &((*uz)->left));
        }
        else if (d == (*uz)->data)// Если равен кладем сюдаже
        {
            (*uz)->num++;
            size++;
            hight_temp_is = false;
        }
    }
 
    
}
 
void tree::add(int& d){
    tree::add(d, &root);
}
 
void tree::print(node *q)
{
    /*if (t == NULL) return 0; //Если дерево пустое, то отображать нечего, выходим
    else //Иначе
    {
        
        for (int h = 0; h < (t->NUM_pod_this / 2) + 1; h++)std::cout << '\t';
        int left = print(t->left);
        int right = print(t->right);
        std::cout << t->data; //И показываем элемент
    }
    return true;*/
     //С помощью рекурсии посещаем правое поддерево
 
    long i;
    if (q)
    {
        print(q->right);
        for (i = 0; i < q->NUM_pod_this*2; i++)
            printf(" ");
        printf("%d\n", q->data);
        print(q->left);
    }
}
 
 
std::ostream &operator<<(std::ostream& os, std::list<std::string, std::allocator<std::string>>& l){
    for (auto k : l){
        os << k << ' ';
    }os << std::endl;
    return os;
}
 
node* tree::serch(int& str, node** t){
    if ((*t) != NULL){
        if (str == ((*t)->data )){
            return *t;
        }
        else if (str > ((*t)->data)){
            serch(str, &(*t)->right);
        }
        else if (str < ((*t)->data)){
            serch(str, &(*t)->left);
        }
    }
    else return NULL;
}
void tree::serch(int& str){
    node* temp = serch(str, &root);
    if (temp != NULL){
        node* left = temp;
        node* right = temp;
        std::cout << "Left branch" << std::endl;
        while (left->left != NULL){
            left = left->left;
            std::cout << "Numeric " << left->data << "  ";
            std::cout << "numder " << left->num << std::endl;
        }
        std::cout << "Right branch" << std::endl;
        while (right->right != NULL){
            right = right->right;
            std::cout << "Numeric " << right->data << "  ";
            std::cout << "numder " << right->num << std::endl;
        }
    }
    if (temp == NULL){ std::cout << "Could not find num" << std::endl; }
}
 
int tree::analiz(node** uz){
    if ((*uz) == NULL) return 0;
    else{
        int max = maximum(analiz(&(*uz)->left), analiz(&(*uz)->right));
        (*uz)->NUM_pod_this = max;
        return max + 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
#include "sequnce.h"
 
 
sequnce::sequnce()
{
}
 
 
sequnce::~sequnce()
{
}
 
sequnce::sequnce(int _size)
{
    size = _size;
    filling_num(size);
    filling_tree();
    tr.analiz(&tr.root);
    //tr.print();
 
    //serch_int(5);
}
 
void sequnce::filling_num(int _size){
    for (int i = 0; i < _size; i++){
        num.push_back(i+1);
    }
    std::random_shuffle(num.begin(), num.end());
}
void sequnce::filling_tree(){
    for (std::vector<int>::iterator i = num.begin(); i != num.end(); i++){
        tr.add(*i);
    }
}
 
void sequnce::serch_int(int d){
    node* temp = tr.serch(d, &tr.root);
    tr.print(temp);
}
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
#pragma once
#include <string>
#include "Node.h"
#include <list>
#include <iostream>
#define node Node<int>
class tree
{
private:
//  node *root;
    bool first;
    int size;
    int hight_temp;
    bool hight_temp_is;
public:
    node *root;
    unsigned int hight;
    tree();
    ~tree();
    void add(int&, node**);
    void add(int&);
    node* serch(int&, node**);
    void serch(int&);
    void tree::print(node *t);
    void print(){ print(root); }
    int analiz(node** uz); 
    int maximum(int a, int b) { return ((a > b) ? (a) : (b)); }
 
    //friend std::ostream &operator<<(std::ostream& os, std::list<int>& l);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "tree.h"
#include <vector>
#include <algorithm>
#include "Node.h"
class sequnce
{
private:
    std::vector<int> num;
    void filling_num(int);
    void filling_tree();
    int size;
    tree tr;
public:
    sequnce();
    sequnce(int _size);
    ~sequnce();
    void print(int);
    void serch_int(int);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
template <typename T>
class Node
{
private:
    //friend class tree<T>;
public:
    Node<T> *left, *right;
    T data;
    int num;
    int h;
    int NUM_pod_this;
    Node() : left(NULL), right(NULL) ,num(0){}
    ~Node(){
        if (left){ delete left; left = NULL; }
        if (right){ delete right; right = NULL; }
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2014, 13:54     Массив из чисел представить в виде упорядоченного бинарного дерева
Посмотрите здесь:

Упаковка бинарного дерева в массив - C++
Подскажите пожалуйста, имеется заполненное бинарное дерево. Необходимо организовать его обход в ширину и данные записать в массив...

Запись бинарного дерева в массив - C++
Как можно записать элементы бинарного дерева в массив? Пробовал одну очень странную идею: void run(Tree *root){ if(root){ ...

Найти среднее арифметическое узлов бинарного дерева целых чисел - C++
Помогите решить. Надо срочно!!! Создать бинарное дерево целых чисел. Вывести на экран значение узлов и их среднее арифметическое

Представить n в виде произведения простых чисел - C++
Нужно найти каждое значение p^a, если дано n. Помогите, пожалуйста.

Представить число в виде сумы кубов двух натуральных чисел - C++
Я только начинаю учится, напишите плиз программу задачей которой является представить число в виде сумы кубов двух натуральных чисел,...

Можно ли представить N! в виде произведения трех последовательных целых чисел? - C++
Всем доброго времени суток! Не смог решить, помогите. Дано натуральное число N. Выяснить, можно ли представить N! в виде произведения...

Как представить натуральное число в виде произведения двух простых чисел - C++
Нашел что то похожее только, там 3 простых числа, и проблема в том что код написан на Paskalе, если можете объяснить или написать код для...

Представить целое число N в виде суммы M примерно равных целых чисел. - C++
В голове не приходит нормального решения. Именуйте темы осмысленно! Название темы должно максимально полно отражать её содержимое.

Определить, можно ли представить число N в виде суммы кубов трех натуральных чисел - C++
Определить можно ли представить заданное натуральное число N как сумму кубов каких-нибудь трех натуральных чисел n, m, k. ...

Можно ли представить данное число в виде произведения трех последовательных натуральных чисел - C++
Помогите пожалуйста решить задачи на С++ 2) (Функция) Дано натуральное число n. Выяснить, можно ли представить n в виде произведения...

Определить, можно ли представить заданное число в виде суммы четырех простых чисел - C++
Люди,помоги решить задачку: Дано натуральное число n. Можно ли представить его в сумме четырех простых чисел? Вывести на печать все...

Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел - C++
Дано натуральное число n.Определить,можно ли представить его в виде суммы двух квадратов натуральных чисел.Если да,то найти все пары x,y...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru