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

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

Восстановить пароль Регистрация
 
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
19.06.2013, 13:13     В двоичном дереве удалить все узлы, значения которых является простым числом #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
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);
    
 
}

вот мой код нужно только удаление прилепить
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 13:13     В двоичном дереве удалить все узлы, значения которых является простым числом
Посмотрите здесь:

Удалить строки, сумма цифр которых является числом Фибоначчи C++
Цикл: Определить все числа, принадлежат промежутку [10,99], сумма цифр которых является простым числом. C++
C++ В двумерном массиве удалить все строки, в которых среднее арифметическое элементов является двузначным числом.
C++ Удалить все строки, в которых среднее арифметическое элементов массива является двузначным числом
C++ Удалить все строки матрицы, в которых среднее арифметическое элементов является двузначным числом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 13:29     В двоичном дереве удалить все узлы, значения которых является простым числом #2
newyork7776, Да это задание не такое простое, нужно обходить дерево, затем сверять значение в узле простое оно число или нет, (простое число это число которое делится только на сомо себя), потом нужно написать функцию удаления, головняк это, там смотреть нужно есть ли в узле потомки, сколько их один потомок два, какой правый левый.

Да это трудоемкая задача.
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
19.06.2013, 13:35  [ТС]     В двоичном дереве удалить все узлы, значения которых является простым числом #3
а єсли удалить парние елементы?

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

Добавлено через 3 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
простое число это число которое делится только на сомо себя
ещо на 1
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.06.2013, 13:36     В двоичном дереве удалить все узлы, значения которых является простым числом #4
Цитата Сообщение от newyork7776 Посмотреть сообщение
у меня проблема в том что когда я нахожу елемент который нужно удалить у меня удаляет не елемент,а ветку
ну если банально удалять этот элемент, то так и выйдет. можно найти первый попавшийся лист бинарного дерева (если это просто бинарное дерево - не поиска, не AVL и т.д.), значение листа записать в удаляемую вершину и затем удалить лист, предварительно в соответствующее поле записав NULL.
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
19.06.2013, 13:41  [ТС]     В двоичном дереве удалить все узлы, значения которых является простым числом #5
Thinker,можна пример,а то в голове пока не укладиваеться
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.06.2013, 13:44     В двоичном дереве удалить все узлы, значения которых является простым числом #6
например, надо удалить 3 в дереве
C++
1
2
   3
1     4
находите лист из левого поддерева данной вершины 1. ставите 1 вместо 3 и удаляете 1. получаете
C++
1
2
   1
        4
и т.д.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
19.06.2013, 15:37     В двоичном дереве удалить все узлы, значения которых является простым числом #7
newyork7776, я тебе просто подскажу, от ты нашол элемент (узел) который нужно удалить допустим. у тебя этот узел может быть корнем, этот узел может иметь два потомка может иметь один левый потомок и может иметь один правый потомок.
От делай функцию del(принимает указатель на узел который нужно удалить) и в функции уже проверку:
if узел у тебя корень? //если корень
** if в узле один правый потомок.
** else if в узле один левый потомок.
** else if в узле ни одного потомка.
else //узел не корень
** if в узле один правый потомок.
** else if в узле один левый потомок.
** else if в узле ни одного потомка.

Вроде примерно как то так и так удаляй как нужно там для каждого условия по своему нужно вроде как удалять. Да я с ней тоже промучился когда делал, код занимал половину кода дерева и головняк покак оттестишь, то оно не то что надо удалит, то ветку не прицепит, в общем морочно все это.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2013, 16:37     В двоичном дереве удалить все узлы, значения которых является простым числом
Еще ссылки по теме:

Найдите все числа из интервала (100, 200), цифровой корень которых является простым числом (1, 2, 3, 5, 7) C++
C++ Определить количество пар чисел сумма которых является простым числом

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

Или воспользуйтесь поиском по форуму:
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
19.06.2013, 16:37  [ТС]     В двоичном дереве удалить все узлы, значения которых является простым числом #8
Кликните здесь для просмотра всего текста
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 минуты
мой вариант только с парним елементом
Yandex
Объявления
19.06.2013, 16:37     В двоичном дереве удалить все узлы, значения которых является простым числом
Ответ Создать тему
Опции темы

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