С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 25

Определить функцию для подсчёта количества вершин бинарного дерева

26.12.2012, 01:57. Показов 2361. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Определить функцию для подсчёта количества вершин бинарного дерева значения которых лежат в определённом диапазоне.
Например:
(yulia ' ((2(5(nil 3 1) 7)) '1 '3)
Ответ
3

или что- подобное
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2012, 01:57
Ответы с готовыми решениями:

Определить функцию для вычисления глубины бинарного дерева
Вообщем вот такая задачка: Определить функцию для вычисления глубины бинарного дерева (глубина пустого дерева равна 0, глубина...

Определить функцию для вычисления глубины бинарного дерева
Дано S-выражение, представляющее дерево вида «(РебенокЛевый Родитель РебенокПравый)». Определить функцию для вычисления глубины этого...

Определить функцию, выполняющую для каждой группы из бинарного дерева вида "РебенокЛевый-Родитель-РебенокПравый" следующее: поменять местами значения
Дана задача: Определить функцию, выполняющую для каждой группы из бинарного дерева вида...

12
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
26.12.2012, 02:49
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun tree-count-if (pred tree)
  (let ((count 0))
    (labels ((%count (ent)
               (cond ((listp ent)
                      (mapcar #'%count ent))
                     ((funcall pred ent)
                      (incf count)))))
      (%count tree)
      count)))
 
(defun in-range (x y)
  #'(lambda (z)
      (<= (min x y) z (max x y))))
Lisp
1
2
3
CL-USER> (tree-count-if (in-range 1 3) '((2 (5 (nil 3 1) 7))))
3
CL-USER>
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.12.2012, 09:34
Если дерево есть список вида: (... (Знач (левый_потомок) (правый_потомок)) ...) то для решения задачи, мне кажется, гораздо проще будет сначала превратить дерево в линейный список, а потом пройтись по этому списку:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun tree-counter (tree vmin vmax)
  (let ((c 0))
    (dolist (i (flatten tree) c)
      (when (and (>= i vmin) (<= i vmax)) (setq c (+ c 1))))))
 
 
==> tree-counter
 
(tree-counter '((2 (5 (nil 3 1) 7))) 1 3)
 
==> 3
0
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 25
26.12.2012, 21:07  [ТС]
Catstail, функция flatten не определена
0
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 25
26.12.2012, 21:13  [ТС]
Nameless One, благодарю.. работает.. не могли бы вы объяснить что происходит в каждой строке?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.12.2012, 21:44
Цитата Сообщение от yuliaaa Посмотреть сообщение
функция flatten не определена
- а ее нетрудно и определить:

Lisp
1
2
3
4
5
(defun flatten (lst) 
  (cond ((null lst) nil)
        ((null (car lst)) (flatten (cdr lst)))  
        ((atom (car lst)) (cons (car lst) (flatten (cdr lst))))
        (t (append (flatten (car lst)) (flatten (cdr lst))))))
и все заработает:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CL-USER 3 : 2 > (defun flatten (lst) 
  (cond ((null lst) nil)
        ((null (car lst)) (flatten (cdr lst)))  
        ((atom (car lst)) (cons (car lst) (flatten (cdr lst))))
        (t (append (flatten (car lst)) (flatten (cdr lst))))))
FLATTEN
 
CL-USER 4 : 2 > (defun tree-counter (tree vmin vmax)
  (let ((c 0))
    (dolist (i (flatten tree) c)
      (when (and (>= i vmin) (<= i vmax)) (setq c (+ c 1))))))
TREE-COUNTER
 
CL-USER 5 : 2 > (tree-counter '((2 (5 (nil 3 1) 7))) 1 3) 
 
3 ;; верно!
0
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 25
26.12.2012, 22:24  [ТС]
спасибо а flatten делает дерево в лин. список?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.12.2012, 05:29
Цитата Сообщение от yuliaaa Посмотреть сообщение
не могли бы вы объяснить что происходит в каждой строке?
в каждой строке - лень. В форме let указывается локальная переменная count, которая будет хранить результат. В форме labels определяется локальная рекурсивная функция %count, которая производит подсчет вершин дерева, удовлетворяющих предикату. Если ее аргумент - атом, удовлетворяющий предикату, то происходит увеличение значения count, если ее аргумент - список, то %count применяется к каждому его элементу.

Функция in-range принимает два значения и возвращает предикат, который проверяет, попадает ли его аргумент в диапазон, задаваемый этими значениями.

Цитата Сообщение от yuliaaa Посмотреть сообщение
спасибо а flatten делает дерево в лин. список?
Да.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
27.12.2012, 10:48
Lisp
1
2
3
4
5
6
7
8
(defun counter (x z w &aux (a (car w)) (d (cdr w)))
  (cond ((null w) 0)
        ((listp a) (+ (counter x z a) (counter x z d)))
        ((and a (<= x a z)) (1+ (counter x z d)))
        ((counter x z d))))
 
> (counter 1 3 '((2 (5 (nil 3 1) 7))))
3
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
27.12.2012, 10:57
Цитата Сообщение от yuliaaa Посмотреть сообщение
спасибо а flatten делает дерево в лин. список?
- да, но не только. В линейный список не попадают Nil-ы (в чем легко убедиться).
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
27.12.2012, 11:03
Lisp
1
2
3
4
5
6
7
8
9
10
(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun counter (x z w)
  (loop for a in (flat w) counting (<= x a z)))
 
> (counter 1 3 '((2 (5 (nil 3 1) 7))))
3
Lisp
1
2
3
4
5
6
7
8
9
10
(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun counter (x z w)
  (count-if #'(lambda (a) (<= x a z)) (flat w)))
 
> (counter 1 3 '((2 (5 (nil 3 1) 7))))
3
1
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
19.11.2014, 09:31
Lisp
1
2
3
4
5
6
7
8
9
10
(defun flat (w)
  (loop for a in w 
        if (and a (atom a)) collect a
        else nconc (flat a)))
    
(defun counter (x z w)
  (count-if #'(lambda (a) (<= x a z)) (flat w)))
 
> (counter 1 3 '((2 (5 (nil 3 1) 7))))
3
Lisp
1
2
3
4
5
6
7
8
9
10
(defun flat (w)
  (loop for a in w 
        if (and a (atom a)) collect a
        else nconc (flat a)))
 
(defun counter (x z w)
  (loop for a in (flat w) counting (<= x a z)))
 
> (counter 1 3 '((2 (5 (nil 3 1) 7))))
3
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
19.11.2014, 12:44
Да... Перемудрил я два года назад. Не надо превращать дерево в список (а уж если превращать, то по-другому!). А лучше вот как:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun tree-count (tree a b)
  (if (null tree) 0
      (let ((l (tree-count (cadr tree) a b))
            (r (tree-count (caddr tree) a b)))
           (if (and (>= (car tree) a) (<= (car tree) b)) (+ (car tree) l r) (+ l r)))))
 
==> tree-count
 
(tree-count '(1 (6 nil nil) (8 (12 nil nil) (-7 nil nil))) 1 5)
 
==> 1
 
(tree-count '(1 (6 nil nil) (8 (12 nil nil) (-7 nil nil))) 1 10)
 
==> 15
 
(tree-count '(1 (6 nil nil) (8 (12 nil nil) (-7 nil nil))) -10 10)
 
==> 8
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2014, 12:44
Помогаю со студенческими работами здесь

Подсчет внутренних вершин бинарного дерева
Помогите пожалуйста дописать программу. Задание: Напишите функцию (count t) , считающую количество внутренних вершин в бинарном дереве...

Homelisp: подсчитать количество вершин бинарного дерева, значение которых меньше заданного N
Дано бинарное дерево содержащее целые числа. Подсчитать количество вершин дерева, значение которого меньше заданного N

Разработать функцию, которая подсчитывает высоту заданного бинарного дерева
Разработать функцию, которая подсчитывает высоту заданного бинарного дерева. 2 примера с разным числом уровней. Сделать в графическом и...

Разработать функцию, которая находит минимальный элемент среди элементов заданного уровня бинарного дерева
Разработать функцию, которая находит минимальный элемент среди элементов заданного уровня бинарного дерева. Номер уровня идёт в параметре.

Написать программу для подсчета количества вершин бинарного дерева
Решите, пожалуйста задачу для turboprolog 2.0:&quot;Написать программу для подсчета количества вершин бинарного дерева, значения которых лежат в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru