Как реализовать двоичное дерево из массива строк, используя данный класс, а затем сериализовать, десериализовать и обойти его?

#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 и так далее. Игнорируйте нулевые узлы, теперь у вас есть конечное дерево.