Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312

В двоичном дереве удалить все узлы, значения которых является простым числом

19.06.2013, 13:13. Показов 1714. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:в двоичном дереве удалить все узлы, значения которых является простым числом.
Пожалуста можна + комментарии.
Спасиба!!!

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <time.h>
using namespace std;
struct  node
{
  int key;
  node *left;
  node *right;
};
 
class TREE
{
  private:
    node *tree; //Указатель на корень дерева.
    
  public: 
    TREE() {tree=NULL;}
    node** GetTree () {return &tree;} //Получение вершины дерева.
    void buildTree (int,node **);
    void CleanTree (node **);
    void Vyvod (node**,int);
    void searchInTree(int ,node **,int);
};
int l(1),q(0); 
void main ()
{
  TREE A;
    int numb;
    cout << "Enter number = ";
    cin >> numb;
  srand(time(NULL));
    A.buildTree (numb,A.GetTree());
  cout<<"\nWrite tree:\n";
  A.Vyvod (A.GetTree(),0);
  
    char symbol;
  do{
    cout << "\n Write symbol, or write 0 for exit ";
    cin >> symbol;
    cout << "\n Number " << symbol << " in tree ";
    A.searchInTree(numb,A.GetTree(),(int)symbol);
    if(q == 0) cout << "NOTHING"; 
    l = 1;
    q = 0;
  }
  while(symbol != '0');
 
 A.CleanTree (A.GetTree());
    cout << endl; 
 system("pause");
}
  
void TREE::buildTree (int x,node **p)
{
    int leftNodes,rightNodes;
    leftNodes = x / 2;
    rightNodes = x - leftNodes - 1;
    
    
  if  (*p==NULL)
  {
 
      *p = new(node);
    (**p).key = rand()%21;   
    (**p).left = NULL; (**p).right = NULL; 
  }
  if(leftNodes > 0) buildTree(leftNodes,&((**p).left));
  if(rightNodes > 0)  buildTree(rightNodes,&((**p).right));
}
 
void TREE::CleanTree (node **w)
{
  if  (*w!=NULL)
  { CleanTree (&((**w).left));
    CleanTree (&((**w).right));
    delete *w; }
}
 
void TREE::Vyvod (node **w,int l)
{
  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::searchInTree (int x,node **p,int s)
{
    int leftNodes,rightNodes;
    leftNodes = x / 2;
    rightNodes = x - leftNodes - 1;
    if((**p).key == s) 
    {   
            cout << l << " ";
            ++q;
    }
    ++l;
  if(leftNodes > 0) searchInTree(leftNodes,&((**p).left),s);
  if(rightNodes > 0)  searchInTree(rightNodes,&((**p).right),s);
    
 
}

вот мой код нужно только удаление прилепить
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.06.2013, 13:13
Ответы с готовыми решениями:

Найти все элементы массива, сумма цифр которых является простым числом.
1)Найти все элементы массива, сумма цифр которых является простым числом. 2)Найти такой элемент массива, сумма цифр в котором...

На отрезке [a, b] найти все пары соседних чисел, произведение которых является простым числом
На отрезке найти все пары соседних чисел, произведение которых является простым числом

Найдите все числа из интервала (100, 200), цифровой корень которых является простым числом (1, 2, 3, 5, 7)
Что не так? и где ввести ограничение чтоб было простое число??? Dim m, s, c, k, a As Byte For m = 100 To 200 k =...

7
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
19.06.2013, 13:29
newyork7776, Да это задание не такое простое, нужно обходить дерево, затем сверять значение в узле простое оно число или нет, (простое число это число которое делится только на сомо себя), потом нужно написать функцию удаления, головняк это, там смотреть нужно есть ли в узле потомки, сколько их один потомок два, какой правый левый.

Да это трудоемкая задача.
0
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
19.06.2013, 13:35  [ТС]
а єсли удалить парние елементы?

Добавлено через 1 минуту
у меня проблема в том что когда я нахожу елемент который нужно удалить у меня удаляет не елемент,а ветку

Добавлено через 3 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
простое число это число которое делится только на сомо себя
ещо на 1
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.06.2013, 13:36
Цитата Сообщение от newyork7776 Посмотреть сообщение
у меня проблема в том что когда я нахожу елемент который нужно удалить у меня удаляет не елемент,а ветку
ну если банально удалять этот элемент, то так и выйдет. можно найти первый попавшийся лист бинарного дерева (если это просто бинарное дерево - не поиска, не AVL и т.д.), значение листа записать в удаляемую вершину и затем удалить лист, предварительно в соответствующее поле записав NULL.
0
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
19.06.2013, 13:41  [ТС]
Thinker,можна пример,а то в голове пока не укладиваеться
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.06.2013, 13:44
например, надо удалить 3 в дереве
C++
1
2
   3
1     4
находите лист из левого поддерева данной вершины 1. ставите 1 вместо 3 и удаляете 1. получаете
C++
1
2
   1
        4
и т.д.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
19.06.2013, 15:37
newyork7776, я тебе просто подскажу, от ты нашол элемент (узел) который нужно удалить допустим. у тебя этот узел может быть корнем, этот узел может иметь два потомка может иметь один левый потомок и может иметь один правый потомок.
От делай функцию del(принимает указатель на узел который нужно удалить) и в функции уже проверку:
if узел у тебя корень? //если корень
** if в узле один правый потомок.
** else if в узле один левый потомок.
** else if в узле ни одного потомка.
else //узел не корень
** if в узле один правый потомок.
** else if в узле один левый потомок.
** else if в узле ни одного потомка.

Вроде примерно как то так и так удаляй как нужно там для каждого условия по своему нужно вроде как удалять. Да я с ней тоже промучился когда делал, код занимал половину кода дерева и головняк покак оттестишь, то оно не то что надо удалит, то ветку не прицепит, в общем морочно все это.
0
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
19.06.2013, 16:37  [ТС]
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <time.h>
using namespace std;
struct  node
{
  int key;
  node *left;
  node *right;
}; 
class TREE
{
  private:
    node *tree; //Вказівник на корінь дерева.
    
  public: 
    TREE() {tree=NULL;}
    node** GetTree () {return &tree;} //отримані вершини дерева.
    void buildTree (int,node **); //будуємо дерево
    void CleanTree (node **);//очистка дерева
    void ObhodLeft (node **);//обхід дерева
    void Vyvod (node**,int);//виводимо наше дерево на екран
    void searchInTree(int ,node **,int);//пошук в дереві
};
int l(1),q(0); 
void main ()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Напиш1ть к1льк1сть цифр = ";
  TREE A;
    int numb;
    cin >> numb;
  srand(time(NULL));
    A.buildTree (numb,A.GetTree());
  cout<<"\nЦе наше дерево\n";
  A.Vyvod (A.GetTree(),0);
 
  cout<<"\nНизх1дний порядок проходження дерева: ";
  A.ObhodLeft (A.GetTree());
  
    char symbol;
  do{
    cout << "\n Напиш1ть 0,щоб вийти з програми ";
    cin >> symbol;
    cout << "\n Цифра " << symbol << " в дерев1 \n";
    A.searchInTree(numb,A.GetTree(),(int)symbol);
    if(q == 0) cout << "Дерево очищенно"; 
    l = 1;
    q = 0;
  }
  while(symbol != '0');
 
 A.CleanTree (A.GetTree());
    cout << endl; 
 system("pause");
}  
void TREE::buildTree (int x,node **p)
{
    int leftNodes,rightNodes;
    leftNodes = x / 2;
    rightNodes = x - leftNodes - 1;
    
    
  if  (*p==NULL)
  {
 
      *p = new(node);
    (**p).key = rand()%21;   
    (**p).left = NULL; 
    (**p).right = NULL; 
  }
  if(leftNodes > 0) buildTree(leftNodes,&((**p).left));
  if(rightNodes > 0)  buildTree(rightNodes,&((**p).right));
} 
void TREE::ObhodLeft (node **w)
{
  if  (*w!=NULL)
  {
    cout<<(**w).key<<" ";
    ObhodLeft (&((**w).left));
    ObhodLeft (&((**w).right));
  }
}
void TREE::CleanTree (node **w)
{
  if  (*w!=NULL)
  { CleanTree (&((**w).left));
    CleanTree (&((**w).right));
    delete *w; }
} 
void TREE::Vyvod (node **w,int l)
{
  int i;
  if  (*w!=NULL)
    { 
      Vyvod (&((**w).right),l+1);
            for  (i=1; i<=l; i++) 
                    cout<<"   ";
            if ((**w).key % 2 != 0) 
                    cout<<(**w).key << endl;
    Vyvod (&((**w).left),l+1);
    }
}
void TREE::searchInTree (int x,node **p,int s)
{
    int leftNodes,rightNodes;
    leftNodes = x / 2;
    rightNodes = x - leftNodes - 1;
    if((**p).key == s) 
    {   
            cout << l << " ";
            ++q;
    }
    ++l;
  if(leftNodes > 0) searchInTree(leftNodes,&((**p).left),s);
  if(rightNodes > 0)  searchInTree(rightNodes,&((**p).right),s);
    
 
}

а я вот так решил задачу,конешно направельно,но результат вроде правильный

Добавлено через 2 минуты
на базе мого варианта можна как-то создать новое дерево и запихать туде елементы которие выводяться на екран?

Добавлено через 2 минуты
мой вариант только с парним елементом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2013, 16:37
Помогаю со студенческими работами здесь

Цикл: Определить все числа, принадлежат промежутку [10,99], сумма цифр которых является простым числом.
Помогите решить задачу: &quot;Определить все числа, принадлежат промежутку , сумма цифр которых является простым числом.&quot; Здесь надо цикл...

Найти все простые числа, не превосходящие заданного числа, сумма цифр которых, также является простым числом
Срочно нужен код программы в C++ (желательно с комментариями). Я бы разобрался и сам, но на это уйдет время, которого у меня нет :( ...

Удалить все строки, сумма элементов которых является двузначным числом
Дан массив, содержащий целые числа, размерностью n на n. Использовать дополнительные массивы нельзя. Выполнить следующие действия: ...

Удалить все строки, в которых среднее арифметическое элементов является двузначным числом
Написать программу,которая удаляет все строки,в которых сред.арифм.элементов является двузначным числом.помогите пожалуйста!срочно надо.

Удалить все строки, в которых среднее арифметическое элементов является двузначным числом
Удалить все строки,в которых среднее арифметическое элементов является двузначным числом.помогите пожалуйста!


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru