Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 2 / 0
Регистрация: 27.02.2017
Сообщений: 101

Деревья(бинарные)

01.03.2018, 16:55. Показов 5217. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Сегодня препод пригвоздил меня к стенке лабой по двоичному бинарному дереву, а точнее мне нужно добыть навык работы с бинарными деревьями. Проблема да и суть вся заключается в том, что лабы эти делаются на С++, и тут возникает вопрос, можно ли данный вопрос реализовать на java.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2018, 16:55
Ответы с готовыми решениями:

Курсач по теме: Структуры данных. Двоичные деревья поиска. Красно-черные деревья
Здравствуйте, я первокурсник, преподавателя по информатике месяца 2 не было, потом появился, дал курсач, пару занятий провел и всё. Не...

Бинарные файлы в Java
Здравствуйте, участники форума! Помогите пожалуйста решить задачу. Необходимо написать два метода saveToBinaryFile() и...

Бинарные деревья
Составить процедуру, определяющую является ли заданное бинарное дерево симметричным.

10
 Аватар для rerf2010rerf
46 / 79 / 6
Регистрация: 10.08.2013
Сообщений: 237
01.03.2018, 16:59
Цитата Сообщение от ASanovS Посмотреть сообщение
возникает вопрос, можно ли данный вопрос реализовать на java
Если вопрос только в этом, то ответ, разумеется, да - можно.
0
0 / 2 / 0
Регистрация: 27.02.2017
Сообщений: 101
01.03.2018, 17:02  [ТС]
rerf2010rerf, Ну это хорошо. А ни пошлете меня в какую нибудь сторону, чтоб хоть что нибудь подобное найти, или может есть какие рекомендации и подсказки.
0
 Аватар для rerf2010rerf
46 / 79 / 6
Регистрация: 10.08.2013
Сообщений: 237
01.03.2018, 17:32
Отчего же не послать? Можно и послать. Вам сюда => Роберт Лафоре "Структуры данных и алгоритмы Java".
1
0 / 2 / 0
Регистрация: 27.02.2017
Сообщений: 101
01.03.2018, 17:58  [ТС]
rerf2010rerf, за книжку вам спасибо, это для меня абсолютно новая тема, так что время на выполнение увеличивается в геометрии.
0
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
01.03.2018, 18:19
ASanovS, по идеи, Головач, доступно рассказывает, но на любителя
https://habrahabr.ru/company/g... og/215275/
1
0 / 2 / 0
Регистрация: 27.02.2017
Сообщений: 101
01.03.2018, 21:42  [ТС]
Aviz__, Судя по Роберту Лафоре зароюсь я туда не на один день. А если еще добавить что с алгоритмами я на вы, то за месяцок может и разберусь.

Добавлено через 1 минуту
И спасибо за ссылочку
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
02.03.2018, 01:43
ASanovS, дерево на минималках (без балансировки, удаления узлов, etc...)
Java
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
import java.util.List;
import java.util.LinkedList;
 
public class SimpleThree<T extends Comparable<T>> {
    private class Node {
        final T value;
        Node left;
        Node right;
 
        public Node(T val) {
            value = val;
            left = null;
            right = null;
        }
    }
 
    private Node root;
 
    private Node appendNode(Node rootNode, T val) {
        if ( rootNode == null )
            return new Node(val);
        else {
            int cmp = rootNode.value.compareTo(val);
            if ( cmp > 0 )
                rootNode.left = appendNode(rootNode.left, val);
            else if ( cmp < 0 )
                rootNode.right = appendNode(rootNode.right, val);
        }
        return rootNode;
    }
 
    private void nodesToList(List<T> list, Node rootNode) {
        if ( rootNode != null ) {
            nodesToList(list, rootNode.left);
            list.add(rootNode.value);
            nodesToList(list, rootNode.right);
        }
    }
 
    public SimpleThree() {
        root = null;
    }
 
    public boolean isEmpty() {
        return root == null;
    }
 
    public void append(T val) {
        root = appendNode(root, val);
    }
 
    public List<T> toList() {
        List<T> list = new LinkedList<>();
        nodesToList(list, root);
        return list;
    }
 
    public static void main(String[] args) {
        SimpleThree<Integer> three = new SimpleThree<>();
        three.append(5);
        three.append(1);
        three.append(4);
        three.append(2);
        three.append(3);
 
        for ( int i: three.toList() )
            System.out.println(i);
    }
}
1
 Аватар для Aviz__
2755 / 2062 / 509
Регистрация: 17.02.2014
Сообщений: 9,491
02.03.2018, 07:48
Цитата Сообщение от ASanovS Посмотреть сообщение
за месяцок
не, гораздо раньше. Ведь познание не линейно!
0
0 / 2 / 0
Регистрация: 27.02.2017
Сообщений: 101
02.03.2018, 23:57  [ТС]
easybudda, Благодарю за пример кода, буду с ним работать и разбираться.
Aviz__ Дело в том что следующие две работы которые мне предстоит сделать относятся к графам которые в книге описывается. Времени до летней сессии у меня вроде хватает, главное теперь не сделать паузу.

Добавлено через 19 минут
easybudda, с пока известной мне информации я попробовал прочитать код и прокомментировать его, правильно ли я определил значения и условия?
Java
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
import java.util.List;
import java.util.LinkedList;
 
//из прочитанной мной информации постораюсь прочитать код
//и хотел бы ваши коментарии.
 
public class SimpleThree<T extends Comparable<T>> {
    
    private class Node { 
        final T value;      //эта переменная должна быть корнем
        Node left;          //левый узел
        Node right;         //правый узел
 
        public Node(T val) {        //конструктор класса
            value = val;
            left = null;
            right = null;
        }
    }
 
    private Node root;  //правильно я понял что это абстрактный метод который
                        //запускает класс Node с корня
 
    private Node appendNode(Node rootNode, T val) {
        if ( rootNode == null )     //если следующее значение нулевое создаем узел
            return new Node(val);   
        else {
            int cmp = rootNode.value.compareTo(val);
            if ( cmp > 0 )          //если значение больше 0 создаем узел с левой стороны
                rootNode.left = appendNode(rootNode.left, val);
            else if ( cmp < 0 )     //если значение меньше 0 создаем узел с правой стороны
                rootNode.right = appendNode(rootNode.right, val);
        }
        return rootNode;
    }
 
    private void nodesToList(List<T> list, Node rootNode) { //в этом еще не разбирался.
        if ( rootNode != null ) {
            nodesToList(list, rootNode.left);
            list.add(rootNode.value);
            nodesToList(list, rootNode.right);
        }
    }
    //с этим тое еще нужно разбираться
    public SimpleThree() {
        root = null;
    }
 
    public boolean isEmpty() {
        return root == null;
    }
 
    public void append(T val) {
        root = appendNode(root, val);
    }
 
    public List<T> toList() {
        List<T> list = new LinkedList<>();
        nodesToList(list, root);
        return list;
    }
 
    public static void main(String[] args) {
        //правильно ли я понимаю то, что тут создается объект SimpleThree и вызывается метод append
        SimpleThree<Integer> three = new SimpleThree<>();
        three.append(5);
        three.append(1);
        three.append(4);
        three.append(2);
        three.append(3);
 
        for ( int i: three.toList() ) //тут печатается уже отсортированное дерево?
            System.out.println(i);
    }
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
03.03.2018, 00:35
ASanovS, немного не так
Java
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
import java.util.List;
import java.util.LinkedList;
 
// дженерик-класс Дерево параметром принимает класс, имплементирующий
// интерфейс Comparable, его объекты должны сравниваться друг с другом 
public class SimpleThree<T extends Comparable<T>> {
    // скрытый внутренний класс Узел
    // пользователей класса Дерево не должно волновать, как именно
    // внутри хранятся данные
    private class Node {
        // ссылка на значение, хранящееся в узле
        // значение не должно меняться, поэтому ссылка объявлена, как final
        // инициализируется при создании узла и такой и остаётся
        final T value;
        // ссылка на левый потомок
        Node left;
        // ссылка на правый потомок
        Node right;
 
        // конструктор узла параметром принимает ссылку на значение
        public Node(T val) {
            value = val;
            // при создании узла у него нет потомков, ссылки на них
            // инициализируются значением null
            left = null;
            right = null;
        }
    }
 
    // ссылка на корневой узел дерева
    private Node root;
 
    // скрытая функция для вставки узла в дерево (имя rootNode не слишком удачное и может
    // сбивать с толка), но в любом случае принимает параметрами ссылку на корневой узел
    // и на вставляемое значение
    private Node appendNode(Node rootNode, T val) {
        // если узел, переданный параметром, пуст (отсутствует),
        // создаётся новый узел с переданным значением и ссылка на него возвращается
        if ( rootNode == null )
            return new Node(val);
        // если узел не пустой
        else {
            // его значение сравнивается со значением, переданным параметром
            int cmp = rootNode.value.compareTo(val);
            // если переданное значение меньше
            if ( cmp > 0 )
                // функция рекурсивно вызывается для левого потомка
                rootNode.left = appendNode(rootNode.left, val);
            // если больше
            else if ( cmp < 0 )
                // для правого
                rootNode.right = appendNode(rootNode.right, val);
        }
        // и в любом случае возвращается ссылка на переданный параметром узел
        // такой подход обретает смысл, когда дерево делается балансируемым
        // при вставке нового узла корневой узел может меняться
        return rootNode;
    }
 
    // скрытая функция, рекурсивно добавляющая в переданный параметром список
    // значения, хранящиеся в узлах дерева
    private void nodesToList(List<T> list, Node rootNode) {
        // если узел не пуст, функция вызывается для его левого потомка,
        // потом в список добавляется значение, хранящееся в узле,
        // после чего функция вызывается для правого потомка
        // таким образом значения в списке упорядочены
        if ( rootNode != null ) {
            nodesToList(list, rootNode.left);
            list.add(rootNode.value);
            nodesToList(list, rootNode.right);
        }
    }
 
    // конструктор класса Дерево
    // изначально дерево пустое, корень инициализируется
    // значением null
    public SimpleThree() {
        root = null;
    }
 
    // функция, возвращающая TRUE, если дерево пустое
    // в примере не используется, написал по привычке,
    // в принципе должна присутствовать
    public boolean isEmpty() {
        return root == null;
    }
 
    // пользовательская функция, добавляющая значение в дерево
    public void append(T val) {
        root = appendNode(root, val);
    }
 
    // пользовательская функция, возвращающая список со значениями,
    // хранящимися в дереве
    public List<T> toList() {
        List<T> list = new LinkedList<>();
        nodesToList(list, root);
        return list;
    }
 
    public static void main(String[] args) {
        // создаём экземпляр дерева
        SimpleThree<Integer> three = new SimpleThree<>();
        // вставляем в него какие-то значения
        three.append(5);
        three.append(1);
        three.append(4);
        three.append(2);
        three.append(3);
 
        // в цикле выводим значения, полученные из дерева
        // в виде списка, убеждаемся, что они выводятся отсортированными
        for ( int i: three.toList() )
            System.out.println(i);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2018, 00:35
Помогаю со студенческими работами здесь

Бинарные деревья
Последняя программа. Нужна помощь! Имеется список, элементы которого – непустые бинарные деревья. Для каждого элемента списка найти...

Бинарные деревья С++
Добрый день! Дали такое задание на лабораторную работу. кое-что получилось, а в остальном прошу Вас помочь... Из входной...

Бинарные деревья
Вот задачка: Для заданного бинарного дерева поиска проверить условие: • для каждой вершины высота левого поддерева отличается от...

Бинарные деревья.
Помогите пожалуйста решить.. Бинарные деревья задаются с помощью тернарного функтора tree(Left,Root,Right), где Root - элемент,...

Бинарные деревья
1)Написать программу подсчета числа вершин в бинарном дереве 2)Написать программу копирования одного бинарного дерева в другое ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru