Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 10

Удаление узлов в TTreeView

17.11.2013, 15:30. Показов 1975. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Делаю по курсовому проекту синтаксический анализатор, обязательные компоненты дерево вывода и дерево операций. Дерево вывода реализовал, а вот для дерева операций нужно из полученного дерева вывода удалять определенные узлы и подсоединять имеющиеся дочерние к узлу верхнего уровня. Реально ли реализовать и если да то как? Прилагается пример на рисунке.
Миниатюры
Удаление узлов в TTreeView  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2013, 15:30
Ответы с готовыми решениями:

TTreeView
Подскажите, а можно ли листы в этом компоненте выводить в две строки?

Работа с TTreeView
Доброго времени суток!!! Вывожу большой список элементов в TreeView на прямую, из за этого программа сильно замедляется. Мне нужно...

TTreeView ondblclick
Приветствую, хочу слепить из TTreeView менеджер файлов, подскажите можно ли повесить dblclick на определённый узел, или хотя-бы как...

10
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2013, 16:04
Что как ? В чем вопрос вообще ?

Описание методов компонента в справке и в Архангельском есть ...
Бери компонент и используй какие проблемы ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
17.11.2013, 17:41
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
// Вот при таком описании узла дерева
struct Item
{
    Item *Left, *Center, *Right;
    char Data;
 
    Item(char AData, Item *ALeft, Item *ACenter, Item* ARight)
    {
        Left = ALeft; Center = ACenter; Right = ARight;
        Data = AData;
    }
};
 
// Это "свернет" исходное дерево так, как ты показал:
Item *Collapse(Item *root)
{
    if(root == 0) return 0;
 
    if(root->Center != 0)
    {
        if(root->Center->Center == 0)
        {
            Item *rt = root;
            root = root->Center;
            root->Left = Collapse(rt->Left);
            root->Right = Collapse(rt->Right);
            delete rt;
            return root;
        }
        else
        {
            Item *rt = Collapse(root->Center);
            delete root->Center;
            return rt;
        }
    }
    else return root;
}
Для теста написал вот такую функцию:

C++
1
2
3
4
5
Item *InsertItem(char AData, Item *pLeft, Item *pCenter, Item *pRight)
{
    Item *newItem = new Item(AData, pLeft, pCenter, pRight);
    return newItem;
}
, с помощью которой создал исходное дерево:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Item *Root = 0;
    Root = InsertItem('S',
        InsertItem('S',
            InsertItem('(', NULL, NULL, NULL),
            InsertItem('S',
                InsertItem('S',
                    NULL,
                    InsertItem('A', NULL, NULL, NULL),
                    NULL),
                InsertItem('+', NULL, NULL, NULL),
                InsertItem('S',
                    NULL,
                    InsertItem('A', NULL, NULL, NULL),
                    NULL)),
            InsertItem(')', NULL, NULL, NULL)),
        InsertItem('*', NULL, NULL, NULL),
        InsertItem('S',
            NULL,
            InsertItem('A', NULL, NULL, NULL),
            NULL));
, потом "свернул" его и посмотрел на результат.

Цитата Сообщение от Avazart Посмотреть сообщение
В чем вопрос вообще ?
Вопрос - в том, как "свернуть" n-арное дерево выражений. Если ты даже вопроса его не понимаешь - то зачем вообще отвечать?

Цитата Сообщение от Avazart Посмотреть сообщение
Описание методов компонента в справке и в Архангельском есть ...
Какого, интересно, компонента? n-арного дерева? Для его хранения никакого компонента на фиг не нужно, у тебя уже болезнь такая, чуть что - всех к Архангельскому отсылать... Во-первых, у него быдлокод еще тот, а во-вторых, все случаи он не описывает...
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2013, 17:45
Цитата Сообщение от UI Посмотреть сообщение
Какого, интересно, компонента? n-арного дерева?
Читай заголовок темы.
Цитата Сообщение от UI Посмотреть сообщение
Если ты даже вопроса его не понимаешь - то зачем вообще отвечать?
Если ты заголовок не читаешь, то о чём дальше говорить?
0
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 10
17.11.2013, 18:35  [ТС]
UI, как вариант можно применить, но у дерева может быть больше 3 узлов, и у меня реализовано с помощью компонента TTreeView, правильно ли я понял, что необходимо запомнить нижележащие узлы в TreeNode, потом удалить текущий узел и добавить тот что сохранен? Идея вроде вполне логична но не работает, код прилагается
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
//функция удаления всех узлов помеченных "S"
int DeleteChild(int&j,TTreeNode *Node,TTreeView *TV)
{
    if(Node->Count==1)
    {
        Node->Text=Node->getFirstChild()->Text;
        Node->getFirstChild()->Delete();
        j++;
    }
    else
    if(Node->Count>1)
    {
        Node = TV->Items->Item[j++];
        DeleteChild(j,Node,TV);
    }
    return j;
}
 
// Цикл в основном обработчике
for(int i=0;i<TreeView1->Items->Count;i++)
    {
        Node1 = TreeView1->Items->Item[j];
        if(Node1->Text=="S")
        {
            if(Node1->HasChildren)
                j = DeleteChild(j,Node1,TreeView1);
        }
        else j++;
    }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
17.11.2013, 19:09
Нельзя в подобных задачах работать данными, хранящимися в компонентах. Компоненты должны (если вообще должны) использоваться только для отображения деревьев. Вся работа - просто с АТД "n-Ary Tree". Иначе запутаешься окончательно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2013, 19:23
Цитата Сообщение от Mishaelll Посмотреть сообщение
UI, как вариант можно применить, но у дерева может быть больше 3 узлов,
Можно использовать std::vector<MyItem*> или TList
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
17.11.2013, 19:54
Цитата Сообщение от Avazart Посмотреть сообщение
Можно использовать std::vector<MyItem*> или TList
А теперь попробуй вычислить (или, что еще интереснее - упростить) выражение, заданное в std::vector-е, или в TList-е. Очень хочется посмотреть...

Задача-то изначальная - синтаксический анализатор. Вот пользователь ввел выражение на 8 строк. Анализатор должен его что? Правильно, преобразовать в дерево (а не в массив и не в список), и, по возможности, выкинуть оттуда лишнее. Как это сделать без самого дерева? Только через... Ну, я думаю, понятно...
0
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 10
17.11.2013, 19:54  [ТС]
UI, все понятно, и по аналогии, если известно что узлов не более n, можно описать похожую структуру получается? с учетом того что дерево строится по полученным в ходе синтаксического анализа правилам, думаю получится не так сложно, спасибо за идею
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2013, 19:58
Цитата Сообщение от UI Посмотреть сообщение
А теперь попробуй вычислить (или, что еще интереснее - упростить) выражение, заданное в std::vector-е, или в TList-е. Очень хочется посмотреть...
Ё_у ...

std::vector<Item*> или TList вместо этого

C++
1
 Item *Left, *Center, *Right;
А не в место самого дерева...
0
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 10
18.11.2013, 16:52  [ТС]
всем спасибо, тема закрыта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2013, 16:52
Помогаю со студенческими работами здесь

TTreeView - количество всех потомков
В общем при добавлении node в дерево я увеличиваю переменную countNode на единицу. Её я использую для перебора всех node в дереве. Если...

Заполнение TTreeView в отдельном потоке
Вот не могу придумать как по нормальному реализовать такую задачу. Есть отдельный поток он должен &quot;просканировать&quot; директорию ...

Действие при нажатии на пункт TTreeView
Здравствуйте, на форме есть компонент TreeView и как пример записанные разделы: Десерт первый второй третий Напитки

Как сделать открытие memo в TTreeview?
Форумчане подскажите идеи как реализовать открытие мемо в дочернем каталоге в TTreeview , прикрепил скрин как хочу реализовать. Загвостка...

TTreeView и его свойство StateImages - работает ли? (BCB6)
Что-то у меня не получается (или я не врубаюсь в логику борланда). В StateImages указываю компонент-ImageList, но никакой реакции на...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru