Zamiana rekursji na iteracje

0
type  TElem = integer;
        PNode = ^TNode;
        TNode = record
                         data:TElem
                         prev:PNode
                         next:PNode
                     end;
          TList = record
                        head:PNode;
                        tail:PNode;
                    end;
       
        procedure BSTtoDLL(root:PNode;var L:TList);
        begin
           if root <> NIL then
           begin
               BSTtoDLL(root^.next,L);
               root^.next := L.head;
               if L.head <> NIL then
                  L.head^.prev := root;
               L.head := root;
               BSTtoDLL(root^.prev,L);
           end;
        end;
  1. Ostatnie wywołanie wygląda na ogonowe i prawdopodobnie da się zamienić na iterację
    ale co z pierwszym ?
    Na co je zamienić aby algorytm miał złożoność czasową O(n)
  2. Tak napisana procedura prawdopodobnie nie ustawi ogona
    Jak to zmodyfikować
0

Ad 1, Nie ustawi czego?
Ad 2. Co to ma wspólnego? Spróbuj sprecyzować pytanie.

0

Nie znam Pascala, ale widzę, że Masz tu double linked list, Napisz co ten kod, w ogóle ma robić, bo wydaje mi się, że wszystkie algorytmy na listach można zapisać iteracyjnie.

1
function treeToList(tree:TTree):TList;
var curr:PBranch;
begin
  Result.head:=nil;
  Result.tail:=nil;
  curr:=tree.root;
  if curr=nil then Exit;
  while curr^.lf<>nil do curr:=curr^.lf;
  while curr<>nil do
  begin
    appendList(Result,curr^.data);
    if curr^.rt<>nil then
    begin
      curr:=curr^.rt;
      while curr^.lf<>nil do curr:=curr^.lf;
    end
    else
    begin
      while (curr^.up<>nil)and(curr^.up^.rt=curr) do curr:=curr^.up;
      curr:=curr^.up;
    end;
  end;
end;

https://ideone.com/LMKnSr

1 użytkowników online, w tym zalogowanych: 0, gości: 1