#java #binary-tree
#java #двоичное дерево
Вопрос:
У меня есть проект кодирования для моего класса структур данных, но я не могу решить, с чего начать. Назначение запрашивает это:
Введите свое двоичное дерево в виде массива, используя представление массива и метки узлов A, …, J в виде строк. Label null обозначает несуществующий узел, а не узел, имеющий значение null. Проверьте правильность ввода вашего двоичного дерева: у каждого узла, за исключением корня, должен быть отец. Сгенерируйте реализацию дерева с динамической памятью, используя только узлы с метками, отличными от null. Сохраните полученный BinaryTreeobject в виде файла, используя сериализацию. Десериализуйте файл, чтобы восстановить дерево. Выполните предварительный порядок, последующий порядок и обход дерева по порядку восстановленного дерева и перечислите метки посещенных узлов. Создайте модульные тесты и реализуйте тестовый класс.
Мне дан класс бинарного дерева:
public class BinaryTree<T> implements java.io.Serializable
{
private T data;
private BinaryTree<T> left;
private BinaryTree<T> right;
public BinaryTree(T data)
{
this.data = data;
left = null;
right = null;
}
public T getData()
{
return data;
}
public void attachLeft(BinaryTree<T> tree)
{
if (tree != null) left = tree;
}
public void attachRight(BinaryTree<T> tree)
{
if (tree != null) right = tree;
}
public BinaryTree<T> detachLeft()
{
BinaryTree<T> t = left;
left = null;
return t;
}
public BinaryTree<T> detachRight()
{
BinaryTree<T> t = right;
right = null;
return t;
}
public boolean isEmpty()
{
return data == null;
}
public void inOrder(BinaryTree <T> tree)
{
if ( tree != null)
{
inOrder(tree.left);
System.out.println(tree.getData());
inOrder(tree.right);
}
}
public void preOrder(BinaryTree <T> tree)
{
}
public void postOrder(BinaryTree <T> tree) {
}
}
Я бы хотел, чтобы это было разбито на более мелкие этапы, если это возможно, поскольку я не уверен, с чего начать. Кроме того, у меня нет опыта работы с сериализацией.
Я не прошу код, просто руководство по этому вопросу.
Комментарии:
1. Вам не нужно делать ничего особенного с вашим классом, чтобы сделать его сериализованным; просто используйте ObjectOutputStream. Быстрый поиск в Интернете по этому вопросу должен привести к появлению множества примеров.
Ответ №1:
-
Предполагая, что отношение строкового индекса к узлу равно
left child = 2 * parent index 1
иright child = 2 * parent index 2
. -
Теперь строка задана в форме
"A, B, ..., J"
, вы можете разбить строку на массив, гдеarr[0] = A
иarr[N] = J
-
Каждый элемент сам по себе является деревом размера 1, и они являются поддеревом большого элемента, который содержит все элементы.
-
Основываясь на индексе, итеративно или рекурсивно добавляйте их в большое дерево. Например,
arr[0] = A = root
,arr[1] = left child = B // because 1 = 2 * 0 1
arr[2] = right child = C // because 2 = 2 * 0 2
и так далее. Игнорируйте нулевые узлы, теперь у вас есть конечное дерево.