Я не знаю Scala, но я знаю Java.
В Java и объектах часто моделируется конкретная вещь, например: автомобиль или B-дерево и т. Д.
Объект будет хранить данные (информацию) об этой вещи.Объект также будет иметь поведение, которое может быть выполнено в отношении данных (например, открыть дверь автомобиля), что часто меняет состояние вещи (изменяет данные).Поведение (метод) может также просто сообщать нам информацию о состоянии объекта и не изменять его состояние.Кроме того, точная форма внутренних данных обычно скрыта (по хорошей практике).
Теперь в любой момент времени объект будет иметь точное состояние.
Так что, если мы думаем о бинарном объекте дерева.у нас может быть двоичное дерево (содержащее целые числа), которое выглядит точно так:
4
/ \
2 1
/ / \
1 3 1
Так что в любой момент времени в нем будет определенное количество узлов с определенными значениями, прикрепленными определенным образом.
Теперь нам нужно решить, как хранить информацию о нашем двоичном дереве.Это будет сделано внутри каждого двоичного дерева.
Итак, мы знаем, что каждое двоичное дерево будет состоять из некоторого числа узлов.
Итак, нам понадобится какой-то способ хранения информации.об узлах.Теперь узлам нужно хранить то, что они содержат, а также то, какие у них левые / правые потомки.Поскольку они содержат более одной части информации, нам нужно хранить их как объекты.
Таким образом, каждый объект узла должен иметь переменную для значения, переменную, которая сообщает нам, каков его левый потомок (если есть), и одну для его правого потомка.
Так что дляузел, содержащий целочисленные значения, мы могли бы перейти:
class Node {
int value;
Node left;
Node right;
}
Теперь не у всех узлов будет левый или правый дочерний элемент (или вообще никаких дочерних элементов).Отсутствие левого потомка представлено левой переменной, имеющей значение 'null', а не ссылающейся на фактический узел.
Приведенный выше код представляет узел в целом без конкретной информации о состоянии, но конкретный узел, который мыСозданный файл будет иметь определенные значения для переменных «value», «left» и «right».
Теперь мы знаем, что двоичное дерево состоит из нескольких узлов.Начинается с корневого узла.И тогда корневой узел будет просто содержать информацию о том, какие узлы находятся под ним (его дочерние элементы).
class BinaryTree {
Node root;
}
Но мы также хотим дать нашему бинарному дереву (то есть объектам) некоторое поведение, чтобы мы могли делать с ним некоторые интересные вещи.В конце концов, зачем нам вообще нужно двоичное дерево - так что мы можем сделать с ним что-то полезное!
Сначала нам нужен «конструктор», чтобы мы могли создать объект двоичного дерева и установить его состояние внекоторые начальные значения.Поэтому мы просто сделаем наши двоичные деревья пустыми.Мы представляем это, имея корневую переменную null.Это просто означает, что у нас даже нет рута!Так что пусто.Мы пишем конструктор в той же форме, что и метод (функция, которая принадлежит классу / объекту), за исключением того, что мы даем ему то же имя, что и сам класс:
class BinaryTree {
Node root;
BinaryTree() {
root = null; // make it so that newly made objects start off being empty
}
}
Мы, вероятно, захотим датьнаше двоичное дерево возбуждает некоторое поведение / методы, так что мы на самом деле можем создать любой вид двоичного дерева, которое мы хотим.Только способность создавать пустые деревья и не менять их, вероятно, не будет полезна!
Таким образом, мы можем создать методы addLeftChild (Node addFrom, int value) и addRightChild (Node addFrom, int value).AddLeftChild создаст новый узел с заданным значением (и без дочерних элементов) и сделает его левым дочерним узлом, заданным addFrom, но только в том случае, если у узла addFrom еще нет левого дочернего элемента.
class BinaryTree {
Node root;
BinaryTree() {
root = null; // make it so that newly made objects start off being empty
}
Node addLeftChild(Node addFrom, int value) {
// change the binary tree's state somehow to achieve this
}
Node addRightChild(Node addFrom, int value) {
// change the binary tree's state somehow to achieve this
}
}
У нас также может быть метод для добавления нового корневого узла, addRoot (int value), чтобы мы могли добавить корневой узел при первом создании двоичного дерева.Возможно, у вас также есть методы (поведение) для удаления узлов.У вас могут быть методы поиска в дереве значений / узлов или предоставления вам информации о дереве (например, глубина, количество узлов).
Тогда мы могли бы написать некоторый код, чтобы фактически создавать объекты двоичного дерева, взаимодействовать с ними каким-либо образом, например:
// this is some main method,etc
BinaryTree ourBT = new BinaryTree(); // make an new binary tree
// remember these start off empty
Node rootNode; // variable so we can tell
// later add methods which node to add from
rootNode = ourBT.addRoot(4);
, это дало бы нам это, поскольку это двоичное дерево, называемое ourBT (простокорневой узел)
4
тогда мы можем пойти:
ourBT.addLeftChild(rootNode, 3); // remember the parameter rootNode refers
// to the root node we just added before
, который оставил бы наше двоичное дерево в этом состоянии:
4
/
3
Тогда мы могли бы пойти:
ourBT.addRightChild(rootNode, 1);
, который оставил бы наше двоичное дерево в этом состоянии:
4
/ \
3 1
Затем, после создания нашего двоичного дерева, мы могли бы, возможно, сделать с ним другие интересные вещи (например: поиск, удаление)
Вероятно, это не лучший пример, но, надеюсь, я дал вам немного понимания того, как пользовательские структуры данных пишутся в ОО-стиле.