Дано дерево удалить нечетные элементы
Добрый день. Нужна помощь в такой вот задаче: необходимо удалить все нечётные элементы дерева. Что-то не разобрался в деревьях. Буду рад любой помощи.
Думаю, построить смогу. Меня больше именно процедура удаления нечётных элементов и все, связанные с ней, интересуют
Поскольку код построения у тебя не вижу просто опишу теорию, как я ее понимаю: Ты создаешь некую процедуру, которая вызывается рекурсивно, в нее передаешь ветку, которую нужно проверить. В цикле в этой функции проходишь эту ветку, и если у нее есть свои ветки, вызываешь функцию, передавая ей найденную подветку. Если данные ветки равны чему-то вызываешь еще одну функцию (которую конечно же ты напишешь), чтоб освободить все входящие в ней ветки так же рекурсивно.
Теоретически я могу представить, как это реализуется, у меня именно затуп с реализацией. Поэтому я прошу помощи.
Ввод (создание дерева) вроде написал. На форме — Edit и кнопка. В Edit ввожу числа через пробел — это и есть элементы дерева.
unit Unit1; interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type < TForm1 >TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private < private declarations >public < public declarations >end; type PTree = ^TTree; TTree = record Data: integer; L, R: PTree; end; var Form1: TForm1; Tree: PTree; implementation < TForm1 >procedure del(var Anode: Ptree); begin if Anode <> nil then begin if Anode^.L <> nil then del(Anode^.L); if Anode^.R <> nil then del(Anode^.R); dispose(Anode); Anode := nil; end; end; procedure Add(var ANode: PTree; x: integer); begin if ANode = nil then begin new(Anode); Anode^.L:= nil; Anode^.R:= nil; Anode^.Data:= x; end else if x >= ANode^.Data then Add(Anode^.R, x) else Add(Anode^.L, x); end; procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s:= Edit1.text; s:= trim(s); del(Tree); while pos(' ', s) <> 0 do begin add(Tree, strtoint(copy(s, 1,pos(' ', s) - 1))); delete(s, 1, pos(' ', s)); end; if s <> ' ' then add(Tree, strtoint(s)); end; end.
procedure StepByStep(var Branch:PTree,WhatFind:Integer); begin if Branch^.Data=WhatFind then begin if Branch^.L<>nil then DeleteBranch(Branch^.L); if Branch^.R<>nil then DeleteBranch(Branch^.R); dispose(Branch); Branch:=nil; end else begin if Branch^.L<>nil then StepByStep(Branch^.L); if Branch^.R<>nil then StepByStep(Branch^.R); end; end;
procedure DeleteBranch(var Branch:PTree); begin if Branch^.L<>nil then DeleteBranch(Branch^.L); if Branch^.R<>nil then DeleteBranch(Branch^.R); Dispose(Branch); Branch:=nil; end;
Возникло у меня несколько вопросов по вашему решению.
Ваша процедура удаления не то же самое, что моя удаления? Или я что-то не понял?
Как в Вашу процедуру добавить проверку на нечётность? Разве не нужно проходить всё дерево для этого?
Твоя, как я вижу, очищает дерево целиком и полностью.
А я разделил на две части — одна делает проход, вторая освобождает ветвь, что попадает под условие. Т.е. у тебя я не вижу механизма анализа что удалять а что оставлять.
Странный вопрос. Как проверять integer на нечетность? Неужели не знаешь?
функцией odd() или оператором mod. Не?
Источник
Дано дерево удалить нечетные элементы
Добрый день. Нужна помощь в такой вот задаче: необходимо удалить все нечётные элементы дерева. Что-то не разобрался в деревьях. Буду рад любой помощи.
Думаю, построить смогу. Меня больше именно процедура удаления нечётных элементов и все, связанные с ней, интересуют
Поскольку код построения у тебя не вижу просто опишу теорию, как я ее понимаю: Ты создаешь некую процедуру, которая вызывается рекурсивно, в нее передаешь ветку, которую нужно проверить. В цикле в этой функции проходишь эту ветку, и если у нее есть свои ветки, вызываешь функцию, передавая ей найденную подветку. Если данные ветки равны чему-то вызываешь еще одну функцию (которую конечно же ты напишешь), чтоб освободить все входящие в ней ветки так же рекурсивно.
Теоретически я могу представить, как это реализуется, у меня именно затуп с реализацией. Поэтому я прошу помощи.
Ввод (создание дерева) вроде написал. На форме — Edit и кнопка. В Edit ввожу числа через пробел — это и есть элементы дерева.
unit Unit1; interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type < TForm1 >TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private < private declarations >public < public declarations >end; type PTree = ^TTree; TTree = record Data: integer; L, R: PTree; end; var Form1: TForm1; Tree: PTree; implementation < TForm1 >procedure del(var Anode: Ptree); begin if Anode <> nil then begin if Anode^.L <> nil then del(Anode^.L); if Anode^.R <> nil then del(Anode^.R); dispose(Anode); Anode := nil; end; end; procedure Add(var ANode: PTree; x: integer); begin if ANode = nil then begin new(Anode); Anode^.L:= nil; Anode^.R:= nil; Anode^.Data:= x; end else if x >= ANode^.Data then Add(Anode^.R, x) else Add(Anode^.L, x); end; procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s:= Edit1.text; s:= trim(s); del(Tree); while pos(' ', s) <> 0 do begin add(Tree, strtoint(copy(s, 1,pos(' ', s) - 1))); delete(s, 1, pos(' ', s)); end; if s <> ' ' then add(Tree, strtoint(s)); end; end.
procedure StepByStep(var Branch:PTree,WhatFind:Integer); begin if Branch^.Data=WhatFind then begin if Branch^.L<>nil then DeleteBranch(Branch^.L); if Branch^.R<>nil then DeleteBranch(Branch^.R); dispose(Branch); Branch:=nil; end else begin if Branch^.L<>nil then StepByStep(Branch^.L); if Branch^.R<>nil then StepByStep(Branch^.R); end; end;
procedure DeleteBranch(var Branch:PTree); begin if Branch^.L<>nil then DeleteBranch(Branch^.L); if Branch^.R<>nil then DeleteBranch(Branch^.R); Dispose(Branch); Branch:=nil; end;
Возникло у меня несколько вопросов по вашему решению.
Ваша процедура удаления не то же самое, что моя удаления? Или я что-то не понял?
Как в Вашу процедуру добавить проверку на нечётность? Разве не нужно проходить всё дерево для этого?
Твоя, как я вижу, очищает дерево целиком и полностью.
А я разделил на две части — одна делает проход, вторая освобождает ветвь, что попадает под условие. Т.е. у тебя я не вижу механизма анализа что удалять а что оставлять.
Странный вопрос. Как проверять integer на нечетность? Неужели не знаешь?
функцией odd() или оператором mod. Не?
Источник
Удаление всех нечётных элементов из дерева
Добрый день. Прошу помочь с задачей: Нужно удалить все нечётные элементы дерева.
Буду рад любой помощи.
Удаление дерева (помещение всех его элементов в список свободного пространства)
Удаление дерева, т.е. помещение всех его элементов в список свободного пространства. нужна помошь
Удаление нечетных чисел из дерева бинарного поиска
Задача: Удалить нечетные числа из дерева бинарного поиска. Вообщем, ошибка в функции удаления.
Сравнить суммы элементов всех четных строк с суммой элементов всех ее нечетных столбцов
Дана матрица размера M*N. Сравнить суммы элементов всех четных строк с суммой элементов всех ее.
Сравнить суммы элементов всех четных строк с суммой элементов всех ее нечетных столбцов
Помогите пожалуйста написать две программы для Turbo Pascal.Заранее благодарю за помощь. Задание.
Спасибо, конечно. Эта информация будет полезной, но меня больше именно процедура удаления нечётных элементов интересует.
а что Вам уже удалось сделать/запрограммировать по данной задаче? хотя бы простая программа по работе с деревом есть?
Ввод (создание дерева) вроде написал. На форме — Edit и кнопка. В Edit ввожу числа через пробел — это и есть элементы дерева.
Код:
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
unit Unit1; interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private public end; type PTree = ^TTree; TTree = record Data: integer; L, R: PTree; end; var Form1: TForm1; Tree: PTree; implementation procedure del(var Anode: Ptree); begin if Anode <> nil then begin if Anode^.L <> nil then del(Anode^.L); if Anode^.R <> nil then del(Anode^.R); dispose(Anode); Anode := nil; end; end; procedure Add(var ANode: PTree; x: integer); begin if ANode = nil then begin new(Anode); Anode^.L:= nil; Anode^.R:= nil; Anode^.Data:= x; end else if x >= ANode^.Data then Add(Anode^.R, x) else Add(Anode^.L, x); end; procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s:= Edit1.text; s:= trim(s); del(Tree); while pos(' ', s) <> 0 do begin add(Tree, strtoint(copy(s, 1,pos(' ', s) - 1))); delete(s, 1, pos(' ', s)); end; if s <> ' ' then add(Tree, strtoint(s)); end; end.
Удалить нечётные элементы или элементы с нечётным Data?
Если первое, то какая нумерация? В глубину обходим или в ширину?
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
procedure DelElem(var head: PTree; value: integer); var parent, ptr, remov, child, mostLeft, mostLeftParent: PTree; begin ptr:= head; parent:= nil; while ptr and (ptr^.Data <> value) do begin parent:= ptr; if value < ptr^.Data then ptr:= ptr^.Left else ptr:= ptr^.Right; end; if ptr then begin remov:= nil; if (not ptr^.Left) or (not ptr^.Right) begin child:= nil; remove:= ptr; if ptr^.Left then child:= ptr^.Left else if ptr^.Right then child:= ptr^.Right; if not parent then head:= child else begin if parent^.Left = ptr then parent^.Left = child else parent^.Right = child; end; end else begin mostLeft:= ptr^.Right; mostLeftParent:= ptr; while mostLeft^.Left do begin mostLeftParent:= mostLeft; mostLeft:= mostLeft^.Left; end; ptr^.Data:= mostLeft^.Data; remov:= mostLeft; if mostLeftParent^.Left = mostLeft then mostLeftParent^.Left:= nil else mostLeftParent^.Right:= nil; //mostLeftParent^.Right:= mostLeft^.Right; end; end; ShowMessage('Deleted: ' + IntToStr(remov^.Data)); Dispose(remov); remov := nil; end; procedure DelNechet(var head: PTree); begin if not Anode then Exit; if Anode^.Data mod 2 <> 0 then DelElem(head, Anode^.Data); if Anode^.Left <> nil then DelNechet(Anode^.Left); if Anode^.Right <> nil then DelNechet(Anode^.Right); end;
Источник
Удаление нечётных элементов в бинарном дереве С++
Задача более чем простая, но ввела меня в ступор. Необходимо из обыкновенного бинарного дерева удалить все нечётные элементы и вывести это же новое дерево на экран. Пользователь вводит int n — количество элементов и сами элементы дерева. Вот что я смог написать (где-то сам, где-то взял из Интернета)
#include #include #include "bintree.h" void paste_node(Tree ** tr, int x) //процедура вставки нового узла < Tree *tree_bin; if ((*tr) == NULL) < //если дерево пусто, то tree_bin = (Tree *)malloc(sizeof(Tree)); //возвращаем указатель на первый байт, если памяти не хватает на нулевой, //с помощью функции malloc tree_bin->item = x; //inf = x tree_bin->lchild = tree_bin->rchild = NULL; //ссылки на левого и правого ребёнка NULL *tr = tree_bin; return; //выход из процедуры > if (x < (*tr)->item) < //если вводимое значение меньше текущего значения, то paste_node(&((*tr)->lchild), x); //вызываем рекурсивно функцию paste_node от левого ребёнка и x > else < //иначе paste_node(&((*tr)->rchild), x); //от правого ребёнка и х > > Tree * minimum(Tree *tr) < if (!tr->lchild->lchild) return tr; return minimum(tr->lchild); > void delete_node(Tree** tr, int num, Tree* parent) //процедура удаления элемента < if (!(*tr)) return; //если дерево пусто, выход из процедуры if (num < (*tr)->item) delete_node(&((*tr)->lchild), num, *tr); else if (num >(*tr)->item) delete_node(&((*tr)->rchild), num, *tr); else < if (!(*tr)->lchild && !(*tr)->rchild)/Если детей у удаляемого узла нет, то перед нами самый простой случай - листовой узел. if (parent) /Родителю данного узла надо сообщить о том, что потомка у него теперь нет if (parent-> lchild) < if (parent->lchild->item == (*tr)->item) < //Если удаляется левый потомок parent->lchild = NULL; > > if (parent->rchild) < if (parent->rchild->item == (*tr)->item) < //Если удаляется правый потомок parent->rchild = NULL; > > > free(*tr); // Освобождаем память *tr = NULL; > else if (!(*tr)->lchild || !(*tr)->rchild) < // Если у удаляемой вершины есть хотя бы один потомок Tree* nodeToRemove = NULL; if ((*tr)->lchild) < //Находим того самого единственного потомка удаляемой вершины nodeToRemove = (*tr)->lchild; > else < nodeToRemove = (*tr)->rchild; > //Скопировать все данные из единственного потомка удаляемой вершины (*tr)->lchild = nodeToRemove->lchild; (*tr)->rchild = nodeToRemove->rchild; (*tr)->item = nodeToRemove->item; //Освободить память, выделенную ранее для данного потомка free(nodeToRemove); > else < //Если у удаляемой вершины есть оба потомка, то согласно алгоритму необходимо найти наименьший элемент в правом поддереве удаляемого элемента if (!(*tr)->rchild->lchild) < //Если у правого поддерева нет левых потомков, то это означает, что у всех потомков значение ключа больше, //а значит надо просто скопировать значения из правого потомка в удаляемый элемент (*tr)->item = (*tr)->rchild->item; // Скопировать значение из правого потомка Tree* rightRIghtChild = (*tr)->rchild->rchild; free((*tr)->rchild); // Освбодить память, выделенную для правого потомка (*tr)->rchild = rightRIghtChild; > else < Tree* minNodeParent = minimum((*tr)->rchild); //Поиск наименьшего элемента в правом поддереве (он обязательно найдётся, случай когда его нет был разобран выше) (*tr)->item = minNodeParent->lchild->item; //Скопировать значение из наименьшего жлемента в правом поддереве в удаляемый элемент free(minNodeParent->lchild); minNodeParent->lchild = NULL; > > > > void print_tree(Tree *tr, int depth) < if (tr != NULL) < print_tree(tr->lchild, depth + 1); for (int i = 0; i < depth; ++i) printf(" "); printf("%ditem); print_tree(tr->rchild, depth + 1); > > void delete_nechet(Tree *tr) < if (!tr) return; if (tr->item % 2 != 0) delete_node(*tr, tr->item, NULL); if (tr->lchild != NULL) delete_nechet(*tr->lchild); if (tr->rchild != NULL) delete_nechet(*tr->rchild); > int main() < int n; cin >> n; Tree tr; for (int i = 0; i < n; i++) < int x; cin >> x; paste_node(tr, x); > delete_nechet(*tr); print_tree(tr, 0); return 0; >
Самая первая ошибка, которая вылазит на этапе компиляции — это отсутствие библиотеки bintree.h, а дальшеее. Как это можно исправить? Что я делаю не так? Буду рад любой помощи
Источник