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

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

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

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

26.06.2014, 13:54. Просмотров 402. Ответов 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++ Представить целое число N в виде суммы M примерно равных целых чисел.
Можно ли представить данное число в виде произведения трех последовательных натуральных чисел C++
C++ Представить n в виде произведения простых чисел
C++ Представить число в виде сумы кубов двух натуральных чисел
Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел C++
C++ Упаковка бинарного дерева в массив
Можно ли представить N! в виде произведения трех последовательных целых чисел? C++
C++ Найти среднее арифметическое узлов бинарного дерева целых чисел
Как представить натуральное число в виде произведения двух простых чисел C++
Определить, можно ли представить число N в виде суммы кубов трех натуральных чисел C++
C++ Определить, можно ли число представить в виде суммы квадратов трех натуральных чисел

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

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

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