![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Aleks |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здраствуйте
Прошу помощи в решение задачи: Подсчитать число вершин на n-ом уровне непустого дерева Т (корень считать вершиной нулевого дерева) я в этом плохо разбираюсь, но кое-что написал Исходный код uses crt; type pitem=^titem; titem=record data:string; pred:pitem; next:pitem; end; var first,last:pitem; ff:text; ss:string; i:integer; procedure add(ss:string); var newitem:pitem; d:string; begin for i:=1 to length(ss) do begin d:=ss[1+length(ss)-i]; new(newitem); newitem^.data:=d; newitem^.pred:=nil; newitem^.next:=first; first:=newitem; if last=nil then last:=newitem; end; end; procedure print; begin end; procedure del; var delitem:pitem; begin delitem:=first; if delitem<>nil then begin first:=delitem^.next; delitem^.Pred^.Next:=delitem^.Next; dispose(delitem); end; end; begin { clrscr; } writeln('--' , memavail); assign(ff,'E:\derevo.txt'); reset(ff); while not (eof(ff)) do begin readln(ff,ss); writeln(ss); end; add(ss); del; close(ff); writeln('--' , memavail); readln; end. |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Aleks, попробуй посмотреть вот тут : FAQ Динамические структуры данных
Сообщение отредактировано: klem4 - 6.09.2005 8:31 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Aleks, у тебя дерево неправильно задано: оно должно задаваться так:
Type, а процедуры создания/удаления дерева - рекурсивны... Их можешь найти в нашем FAQ-е по ссылке которую дал klem4. Нужная тебе процедура будет выглядеть вот так: var count: integer; { изначально = 0 } |
Aleks |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
спасибо klem4 за ссылку, полезная информация
|
Aleks |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
проверьте правильно сделал или нет
Исходный код uses crt; type ttype=record n:integer; count:integer; end; TTree=^TNode; TNode=Record data:TType; Left, Right:TTree; end; var t:TTree; ff:text; d,ss:string; i:integer; procedure add(var T: TTRee; i:Integer); procedure CreateNode(var p:TTRee; n:integer); begin new(p); p^.Data.n:=n; p^.Data.Count:=1; p^.Left:=nil; p^.Right:=nil; end; begin if t<>nil then with t^ do begin if Data.n<i then Add(Right,i) else if Data.n>i then Add(Left,i) else Inc(Data.Count) end else CreateNode(T,i); end; procedure Delete(T: TTRee); begin if T=nil then Exit; delete(T^.Right); delete(T^.left); dispose(t); end; begin writeln('--' , memavail); assign(ff,'E:\derevo.txt'); reset(ff); while not (eof(ff)) do begin readln(ff,ss); {writeln(ss);} end; for i:=1 to length(ss) do begin d:=ss[1+length(ss)-i]; add(T,1); end; delete(t); close(ff); writeln('--' , memavail); readln; end. вопрос: по процедуре add, я хотел бы понять ее действие Код if t<>nil then with t^ do begin if Data.n<i then Add(Right,i) else if Data.n>i then Add(Left,i) else Inc(Data.Count) end else CreateNode(T,i); |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(Aleks @ 6.09.05 13:02) вопрос: по процедуре add, я хотел бы понять ее действие Дело в том, что бинарные деревья так устроены, чтоЦитата(FAQ:Деревья) для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла. Отсюда и реализация Add: Procedure Add(Var T: TTree; i: Integer); А по поводу твоей программы - я например не понял, почему ты добавляешь только единицы в дерево... В результате ты получишь не дерево, в один только корневой элемент, значение N которого будет равно 1, а Count будет равен длине последней строки файла (ибо все остальные строки ты пропускаешь)... Смысл такой программы в чем? Что ты хотел, чтобы содержалось в дереве? Скорее всего, тебе надо добавлять НЕ целые числа, а символы или строки, так поменяй типы там где надо... |
Aleks |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
есть файл derevo.txt , с которого считываются данные (дерево методом вложенных скобок (0(1(2((5)(6)))(3)(4))(7((8)(9(1))))) )
я решил сделать так Код for i:=1 to length(ss) do begin {write('- ',d);} case ss[i] of '0'..'9': begin add(T,ss[i]); write(' ',ss[i],' '); end; '(': zn:=true; ')': zn:=false; end; end; но как сделать в процедуре add я предположил так, но здесь не совсем правильно, дерево должно ветвится 0-1-2-5 -------6 -----3 -----4 ---7-8 -----9-1 Код begin if t<>nil then with t^ do begin if zn=true then Add(Right,i) else if zn=false then Add(Left,i) else Inc(Data.Count) end else CreateNode(T,i); end; помогите, в каком направление думать Сообщение отредактировано: Aleks - 6.09.2005 14:28 |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Ах, вот оно что !!!
![]() |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Кстати, если задача не состоит в том, чтобы дерево построить, а достаточно только подсчитать количество узлов на N-ом уровне, то можно просто парсить строку:
const needed_level = 3; Что-то в этом духе... |
Aleks |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo , я тебя понял, но цель работы
Освоить основные способы представления деревьев в оперативной памяти ЭВМ и практически реализовать алгоритмы работы с деревьями т.е. мне нужно построить дерево за алгоритм подсчета количество узлов спасибо |
Aleks |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
Подскажите пожалуйста в решении задачи
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Минут через 20 выложу решение ;)
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Вот, что получилось:
(рекурсивный разбор строки с одновременным заполнением дерева. В результате получаем бинарное дерево, соответствующее заданному в строке корневому. PrintTreeGraph - для контроля результата, сама функция лежит здесь. Собственно код: uses crt, graph; |
Aleks |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
я вставил функцию PrintTreeGraph
volvo ЭТО СУПЕР |
Aleks |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo Помоги :molitva:
я уже голову сломал, не могу придумать, как вычислить кол-во вершин на n-уровне непустого дерева Т (корень считать вершиной нулевого дерева) |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Ну, если вот эта процедура не устраивает, то приводи свое определение "вершины":
var count: integer; { изначально = 0 } |
Aleks |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
где level - искомый уровень
if (root<>nil) then - он не выполняет условие (т.е. выходит из процедуры) |
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Значит, ты неправильно вызываешь эту процедуру. Я только что проверил - все работает... Попробуй основную часть программы (пост №13) сделать вот такой, и добавить мою процедуру:
begin |
Aleks |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo
я прикрепил файл (изображение дерева) я его правильно понимаю, что на 1,2 уровень вершин нет 3 уровень 2 вершины 4 уровень 3 вершины 5 уровень 1 вершина Эскизы прикрепленных изображений ![]() |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Я же тебе говорю, что то, у чего ЕСТЬ хотя бы один потомок - это "вершина". То, у чего НЕТ потомков - "лист". Моя процедура (пост №16) ищет число "вершин". Если тебе нужны "листья" - то условие
if (curr_level = level) and { находимся на нужном уровне } меняй на if (curr_level = level) and { находимся на нужном уровне } |
![]() ![]() |
![]() |
Текстовая версия | 19.07.2025 23:12 |