Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 3
Регистрация: 17.12.2015
Сообщений: 62
1

Базовые операции с бинарным деревом

30.09.2018, 16:27. Показов 2843. Ответов 0

Author24 — интернет-сервис помощи студентам
Добрый день! Прошу помощи в выполнении задания. Задача стоит следующая: создать бинарное дерево с функциями добавления удаления и сортировки элементов. Язык - с++.

Сложности возникают с сортировкой.

Самому толком найти ни чего не удалось. В ходе изучения темы наковырял вот такой код:

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
#include <iostream> // for cin cout
using namespace std;
struct TREE
{
int d; // число
TREE *left; //указатель на левое поддерево
TREE *rigth; //указатель на правое поддерево
};
void first (TREE *&,int );
TREE* search (TREE *, int );
void find (TREE *, TREE *&, int );
void add (TREE *, int );
void print_tree (TREE * );
void print_tree_level (TREE *, int );
void del_tree (TREE *&top);
 
 
int main( void )
{
int b[ ] = {20, 10, 8, 12, 30, 25, 34, 22};
TREE *top;
first(top, b[0]); //формирование первого узла дерева
for (int i = 1; i < 8; i++)
add (top, b[i]); // добавление узлов дерева
cout<<" tree1";
print_tree (top); // вывод элементов дерева на экран
cout<< endl;
cout<<" tree2";
print_tree_level(top,0);
 // вывод элементов дерева на экран по уровням
del_tree(top) ; // удаление дерева
cout<<" tree3";
print_tree (top); // проверка того, что дерево пусто
cout<< endl;
}
// формирование первого узла дерева
void first (TREE *&top, int d)
{
top = new TREE;
top -> d = d;
top -> left = top -> rigth = NULL;
}
// поиск места для нового узла
// возвращаем адрес узла, после которого нужно добавить
// новый элемент
TREE* search(TREE *top, int d)
{
TREE *pv = top, *ppv;
while (pv)
{ ppv = pv;
if (d < pv -> d)
 pv = pv -> left;
else
 pv = pv -> rigth;
}
return ppv;
}
 
// поиск места для нового узла рекурсивный вариант
// возвращаем адрес узла, после которого нужно добавить новый элемент
void find(TREE *top, TREE *&p, int d)
{
if (top)
 {
p = top;
if (d < top -> d )
 find(top -> left, p, d);
else
 find(top -> rigth, p, d);
}
else
 p = NULL;
}
// включение нового узла
void add (TREE *top, int d)
{
TREE *ppv,*pnew = new TREE; // создаем новый узел
pnew -> d = d;
pnew -> left= NULL;
pnew -> rigth = NULL;
ppv = search(top, d); // поиск места для нового узла
// find(top, ppv,d); // или так
if (d < ppv -> d)
 ppv -> left = pnew;
 //присоединение к левому поддереву предка
else
 ppv -> rigth = pnew;
 //присоединение к правому поддереву предка
}
// обход дерева и вывод значений в отсортированном порядке
void print_tree (TREE * top)
{
if (top)
{
print_tree (top -> left); //обход левого поддерева
cout << top -> d << " ";
print_tree(top -> rigth);//обход правого поддерева
}
}
 
// обход дерева и вывод значений по уровням
void print_tree_level(TREE * top, int level)
{
if (top)
{
print_tree_level (top -> left, level + 1);
 //обход левого поддерева
for (int i = 0; i < level; i++)
 cout <<" ";
cout << top ->d <<endl;
print_tree_level(top -> rigth, level + 1);
 //обход правого поддерева
}
}
// удаление дерева
void del_tree (TREE *&top)
{
if (top)
{
del_tree (top -> left); //обход левого поддерева
del_tree(top -> rigth);//обход правого поддерева
delete top; // освобождение памяти
top = NULL;
}
}

И вот еще ( то что надо мне но с поиском) :

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include<iostream>
#include<locale.h>
using namespace std;
#define TRUE 1
#define FALSE 0
struct  node
{
  int Key;
  int Count;
  node *Left;
  node *Right;
};
 
class TREE
{
  private:
    node *Tree;//Указатель на корень дерева.
    node  *Res;//Указатель на найденную вершину.
    int B; //Признак нахождения вершины в дереве.
    //Поиск вершины в дереве (рекурсивный алгоритм).
    void Search (int, node**);
    void Delete_1 (node**,node**);
  public:
    TREE() { Tree = NULL;}
    node** GetTree() {return &Tree;}
    void  BuildTree ();//Построение бинарного дерева.
    //Вывод дерева на экран (рекурсивный алгоритм).
    void Vyvod (node**,int);
    //Поиск вершины в дереве (нерекурсивный алгоритм).
    int Poisk (int);
    
    // Удаление вершины из дерева.
    void Delete (node**, int);
};
 
int main ()
{
  TREE A;
  int el;
 
  A.BuildTree ();  A.Vyvod (A.GetTree(),0);
  setlocale(LC_ALL, "Rus");
  cout<<"Введите ключ вершины, которую нужно найти в дереве: ";
  cin>>el;
  if  (A.Poisk (el)) cout<<"В дереве есть такая вершина!\n";
  else  cout<<"В дереве нет такой вершины!\n";
  
 
  cout<<"Введите ключ удаляемой вершины: "; cin>>el;
  A.Delete (A.GetTree(),el);  A.Vyvod (A.GetTree(),0);
}
 
void TREE::BuildTree ()
//Построение бинарного дерева.
//Tree - указатель на вершину дерева.
{
  int el;
setlocale(LC_ALL, "Rus");
  cout<<"Вводите ключи вершин дерева: \n";
  cin>>el;
  while  (el!=0)
    { Search (el,&Tree);cin>>el; }
}
 
void TREE::Vyvod (node **w,int l)
//Изображение дерева w на экране дисплея
//         (рекурсивный алгоритм).
//*w - указатель на корень дерева.
{
  int i;
 
  if  (*w!=NULL)
  {
    Vyvod (&((**w).Right),l+1);
    for  (i=1; i<=l; i++) cout<<"   ";
    cout<<(**w).Key<<endl;
    Vyvod (&((**w).Left),l+1);
  }
}
 
 
void TREE::Search (int x,node **p)
//Поиск звена x в бинарном дереве со вставкой
//            (рекурсивный алгоритм).
//*p - указатель на вершину дерева.
{
  if  (*p==NULL)
  { // Вершины в дереве нет; включить ее.
    *p = new(node);
    (**p).Key = x;     (**p).Count = 1;
    (**p).Left = (**p).Right = NULL;
  }
  else
  if  (x<(**p).Key) Search (x,&((**p).Left));
  else
    if  (x>(**p).Key) Search (x,&((**p).Right));
    else  (**p).Count += 1;
}
 
 
 
int TREE::Poisk (int k)
// Поиск вершины с ключом k в дереве
//      (нерекурсивный алгоритм).
// Tree - указатель на бинарное дерево.
// Res  - указатель на найденную вершину
// или на лист, к которому можно присоединить новую вершину.
{
  node *p,*q;
 
  B = FALSE; p = Tree;
  if  (Tree!=NULL)
  do
  {
    q = p;
    if  ((*p).Key==k) B = TRUE;
    else
      {
       q = p;
       if  (k<(*p).Key) p = (*p).Left;
       else  p = (*p).Right;
      }
  } while  (!B && p!=NULL);
  Res = q;
  return B;
}
 
void TREE::Delete (node **p,int k)
// Удаление вершины k из бинарного дерева.
// *p - указатель на корень дерева.
{
  node *q;
 
  if  (*p==NULL) cout<<"Вершина с заданным ключом не найдена!\n";
  else
     if  (k<(**p).Key) Delete (&((**p).Left),k);
     else
        if  (k>(**p).Key) Delete (&((**p).Right),k);
        else
          {
                    q = *p;
                    if  ((*q).Right==NULL) {*p = (*q).Left; delete q;}
                    else
                     if  ((*q).Left==NULL) { *p = (*q).Right; delete q; }
                     else  Delete_1 (&((*q).Left),&q);
          }
}
 
void TREE::Delete_1 (node **r,node **q)
{
  node *s;
 
  if  ((**r).Right==NULL)
  {
    (**q).Key = (**r).Key; (**q).Count = (**r).Count;
    *q = *r;
    s = *r; *r = (**r).Left; delete s;
  }
  else  Delete_1 (&((**r).Right), q);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2018, 16:27
Ответы с готовыми решениями:

Сортировка бинарным деревом
Получить число n на ввод; сделать сортировку бинарным деревом и построить дерево графически

Отобразить бинарным деревом предложение
Ребят прошу вашей помощи, буду очень признателен. Отобразить с помощью бинарного дерева...

Разработать программу работы с бинарным деревом
Народ, прошу помощи в решении нескольких заданий, в противном случае, не видать мне сессии.......

Разработать программу работы с бинарным деревом
Разработать программу работы с бинарным деревом. Программа должна содержать следующие процедуры,...

0
30.09.2018, 16:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2018, 16:27
Помогаю со студенческими работами здесь

Бесконечный цикл при работе с бинарным деревом
Добрый вечер. Помогите разобраться на третьем обьекте в бинарном дереве ухожу в бесконечный цикл....

Помогите кто может заделать задачку с бинарным деревом...
Вершина бинарного дерева содержит ключ, строку и два указателя на потомков. Написать функцию,...

Задача с бинарным деревом (написать функцию, которая свяжет все узлы на одном уровне:)
Есть бинарное дерево: struct node { int n; // value of node struct node *left; // left subtree...

Работа с массивом - предусмотреть все базовые операции
. Постановка задачи 1) Сформировать массив из n элементов с помощью датчика случайных чисел (n...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru