class ObjectTree{
// Количество цифр в ID-коде объекта:
private static int IDnum=8;
// Уровень объекта (буква):
private char Level;
// Номер объекта на уровне:
private int Number;
// Код объекта (массив цифр):
private int[] ID;
// Ссылка на первый объект:
ObjectTree FirstRef;
// Ссылка на второй объект:
ObjectTree SecondRef;
// Метод для генерирования ID-кода объекта:
private void getID(){
ID=new int[IDnum];
for(int i=0;i<IDnum;i++)
ID[i]=(int)(Math.random()*10);
}
// Метод для отображения ID-кода объекта:
private void showID(){
for(int i=0;i<IDnum;i++)
System.out.print("|"+ID[i]);
System.out.print("|\n");
}
// Метод для отображения параметров объекта:
void show(){
System.out.println("Уровень объекта: \t"+Level);
System.out.println("Номер на уровне: \t"+Number);
System.out.print("ID-код объекта: \t");
showID();
}
// Конструктор создания бинарного дерева:
ObjectTree(int k,char L,int n){
System.out.pr1nt1n("\tСоздан новый объект!");
Leve1=L;
Number=n;
getID();
show();
if(k==1){
FirstRef=nu11;
SecondRef=nu11;
}
else{
// Рекурсивный вызов конструктора:
FirstRef=new ObjectTree(k-1,(char)((1nt)L+1),2*n-1);
SecondRef=new ObjectTree(k-1,(char)((1nt)L+1),2*n);}
}}
class ObjectTreeDemo{
public static void main(String[] args){
// Дерево объектов:
ObjectTree tree=new ObjectTree(4,'A',1);
System.out.pr1nt1n("\tПроверка структуры дерева объектов!");
// Проверка структуры дерева объектов:
tree.F1rstRef.SecondRef.F1rstRef.show();
}}
Конструктор класса принимает три аргумента: целочисленный аргумент определяет количество уровней в структуре, начиная с текущего объекта, а символьные аргументы определяют метку уровня и номер объекта на уровне. Детальнее остановимся на коде конструктора, поскольку именно при его вызове создается вся структура бинарного дерева.
При вызове конструктора выводится сообщение о создании объекта, после чего на основе значений аргументов конструктора присваиваются значения полям Level и Number. Затем с помощью метода getID() генерируется идентификационный код объекта и методом show() выводится информация о созданном объекте. Вторая часть кода конструктора реализована через условную инструкцию. В ней первый аргумент конструктора проверяется на предмет равенства единице. Если первый аргумент равен единице (это означает, что после текущего объекта других объектов нет), полям-ссылкам FirstRef и SecondRef в качестве значений присваиваются нулевые ссылки (значение null), означающие, что текущий объект не имеет ссылок на другие объекты. В противном случае, то есть если аргумент конструктора отличен от единицы, следующими командами создаются два новых объекта, и ссылки на них в качестве значений присваиваются полям FirstRef и SecondRef текущего объекта:
FirstRef=new ObjectTree(k-1,(char)((int)L+1),2*n-1);
SecondRef=new ObjectTree(k-1,(char)((int)L+1),2*n);
При этом конструкторам при создании новых объектов передается на единицу уменьшенный первый аргумент. Уровень новых создаваемых объектов вычисляется на основе текущего значения L для уровня текущего объекта как (char) ((int)L+1). Инструкцией (int)L вычисляется код символа L, а затем, после увеличения кода символа на единицу, выполняется явное преобразование в символьный вид (инструкцией (char)). Для первого из двух создаваемых объектов номер объекта вычисляется на основе номера текущего объекта n как 2*n-1. Второй объект получает номер 2*n. Принцип нумерации рассчитан так, что если в вершине иерархии объект имеет номер 1, то на всех прочих уровнях объекты нумеруются последовательностью натуральных чисел. Таким образом, код конструктора класса реализован по рекурсивному принципу: в конструкторе вызывается конструктор, но с другими аргументами. Чтобы создать бинарное дерево, вызывается конструктор, первым аргументом которому передается количество уровней в бинарном дереве, имя (буква) для первого объекта и номер объекта в вершине иерархии объектов дерева.
В главном методе программы командой
ObjectTree tree=new ObjectTree(4,'A',1)
создается дерево из четырех уровней, после чего выполняется проверка созданной структуры: через систему последовательных ссылок вызывается метод show() для отображения параметров одного из объектов в структуре дерева (командой tree.FirstRef.SecondRef.FirstRef.show()). Результат выполнения программы может иметь следующий вид:
Создан новый объект!
Уровень объекта: A
Номер на уровне: 1
ID-код объекта: |3|5|1|1|1|1|5|0|
Создан новый объект!
Уровень объекта: B
Номер на уровне: 1
ID-код объекта: |3|6|4|8|2|2|2|9|
Создан новый объект!
Уровень объекта: C
Номер на уровне: 1
ID-код объекта: |7|6|7|8|9|1|5|7|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 1
ID-код объекта: |5|6|6|1|6|6|5|4|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 2
ID-код объекта: |3|6|5|0|2|1|6|7|
Создан новый объект!
Уровень объекта: C
Номер на уровне: 2
ID-код объекта: |7|6|0|9|6|1|0|2|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 3
ID-код объекта: |9|2|6|2|5|5|9|9|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 4
ID-код объекта: |8|7|7|0|1|2|1|4|
Создан новый объект!
Уровень объекта: B
Номер на уровне: 2
ID-код объекта: |1|7|3|8|8|1|9|2|
Создан новый объект!
Уровень объекта: C
Номер на уровне: 3
ID-код объекта: |9|3|2|4|7|9|4|7|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 5
ID-код объекта: |7|9|6|4|9|4|4|4|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 6
ID-код объекта: |0|9|5|4|5|5|7|4|
Создан новый объект!
Уровень объекта: C
Номер на уровне: 4
ID-код объекта: |4|1|6|6|9|7|8|1|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 7
ID-код объекта: |6|4|7|5|0|0|0|3|
Создан новый объект!
Уровень объекта: D
Номер на уровне: 8
ID-код объекта: |3|9|9|6|7|3|6|3|
Проверка структуры дерева объектов!
Уровень объекта: D
Номер на уровне: 3
ID-код объекта: |9|2|6|2|5|5|9|9|
Сначала сверху вниз (см. рис. 5.2) создаются объекты, имеющие номер 1. Затем создается объект последнего уровня с номером 2. Далее создается объект предпоследнего уровня с номером 2, после чего объект предпоследнего уровня с номером 3, объект с номером 4 и т. д. Командой tree.FirstRef.SecondRef.FirstRef. show() метод show() вызывается из объекта уровня D с номером 3. Параметры именно этого объекта отображаются в конце программы.