Итак, я попробовал рекурсивную и итеративную версию.
В итерационной версии я получил что-то вроде этого, я использовал стеки, которые разрешены в моих случаях
function get_all_nodes(Current_Node:in Tree) return Stack is
--declarations
My_Stack: Stack;
copy:Tree;
finished: Boolean:=False;
begin
--Initialisation
copy:=Current_Node;
My_Stack:=Initialisation;
--beginning by pushing the first node on the stack
push_on_stack(stack,copy.all.elt);
while(copy/=null or finished =False) loop
--check that we can put the first parent on stack
if(copy.all.parent1/=null and not Found_in_Stack(My_Stack,copy.all.parent1.all.elt)) then
copy:=copy.all.parent1;
push_on_stack(stack,copy.all.elt);
end if;
--check that we can put the second parent on stack
if(copy.all.parent2/=null and not Found_in_Stack(My_Stack,copy.all.parent2.all.elt)) then
copy:=copy.all.parent2;
push_on_stack(stack,copy.all.elt);
end if;
--check we are on case where both parents are already on stack or both null
if(copy.all.parent1=null and copy.all.parent2=null) or
(Found_in_Stack(My_Stack,copy.all.parent1.all.elt) and (Found_in_Stack(My_Stack,copy.all.parent2.all.elt))) then
--check we are on case where we are back to first node and then it's finished
if(copy.all.elt=Current_Node.all.elt) then
finished:=True;
else
--go back to previous node thanks to stack
copy:= First_Element_after_top_of_stack(My_Stack);
end if;
end if;
end loop;
return My_Stack;
end get_all_nodes;
И у меня есть некоторые ошибки где-то в этот момент
copy.all.parent2/=null and not Found_in_Stack(My_Stack,copy.all.parent2.all.elt)
Там, где кажется, что выполняется второе условие после первого, и я получаю ошибку, потому что copy.all.parent2.all.elt = null вместо универсального элемента, который находится в стеке и в дереве.
Я попробовал рекурсивную версию по этому коду:
function get_all_nodes (Current_Node : in Tree) return Integer_Concatenation.Element_Array is
use Integer_Concatenation;
use type Element_Array;
begin
if(Tree_is_null(Current_Node)) then
return (1..0 => <>);
else
return Element_Array'(1 => Get_node_value(Current_Node)) & get_all_nodes(Current_Node.all.parent1) & get_all_nodes(Current_Node.all.parent2);
end if;
end get_all_nodes;
У меня не получена одна проверка CONSTRAINT_ERROR длины.
Сейчас я проверю, как минимизировать проблему длины, прочитав ссылку на trashgod, в противном случае я проверю, могу ли я использовать контейнеры Ada.
Еще раз спасибо за вашу помощь всем.
Привет.