Сформировать дерево Т и присвоить параметру Е элемент из самого левого листа (лист — вершина,из которой не выходит не одной ветки) — Pascal(Паскаль) — Delphi(Делфи)

Pascal

type
  PNode = ^TNode;
  TNode = record Value: integer; LeftChild, RightChild: PNode end;
 
// Это функция, которая находит крайне левый лист в дереве
function FindMostLeftLeaf(ATree: PNode): integer;
begin
  repeat
    if ATree^.LeftChild <> NIL then
      ATree := ATree^.LeftChild
    else if ATree^.RightChild <> NIL then
      ATree := ATree^.RightChild
    else begin
      Result := ATree^.Value;
      exit;
    end;
  until False;
end;
 
// Это функция, которая рекурсивно заполняет дерево размерности Dimension используя стартовое значение AStartValue
function GetTree(ADimension: integer; AStartValue: integer): PNode;
var
  I: integer;
  TopLevelNode: PNode;
begin
  New(Result);
  Result^.Value := AStartValue;
  Result^.LeftChild := NIL;
  Result^.RightChild := NIL;
 
  TopLevelNode := Result;
  for I:=1 to ADimension do begin
    TopLevelNode^.LeftChild := GetTree(ADimension-1, AStartValue+I);
    TopLevelNode^.RightChild := GetTree(ADimension-1, AStartValue+I);
  end;
end;
 
// Это основная функция, которая заполняет дерево и запускает тест
procedure GetTestResults;
var
  Tree: PNode;
begin
  Tree := GetTree(10, 0);
  WriteLn(FindMostLeftLeaf(Tree));
end;
 
begin
  GetTestResults;
end.

Delphi

type
  PNode = ^TNode;
  TNode = record Value: integer; LeftChild, RightChild: PNode end;
 
// Это функция, которая находит крайне левый лист в дереве
function FindMostLeftLeaf(ATree: PNode): integer;
begin
  repeat
    if ATree^.LeftChild <> NIL then
      ATree := ATree^.LeftChild
    else if ATree^.RightChild <> NIL then
      ATree := ATree^.RightChild
    else begin
      Result := ATree^.Value;
      exit;
    end;
  until False;
end;
 
// Это функция, которая рекурсивно заполняет дерево размерности Dimension используя стартовое значение AStartValue
function GetTree(ADimension: integer; AStartValue: integer): PNode;
var
  I: integer;
  TopLevelNode: PNode;
begin
  New(Result);
  Result^.Value := AStartValue;
  Result^.LeftChild := NIL;
  Result^.RightChild := NIL;
 
  TopLevelNode := Result;
  for I:=1 to ADimension do begin
    TopLevelNode^.LeftChild := GetTree(ADimension-1, AStartValue+I);
    TopLevelNode^.RightChild := GetTree(ADimension-1, AStartValue+I);
  end;
end;
 
// Это основная функция, которая заполняет дерево и запускает тест
procedure GetTestResults;
var
  Tree: PNode;
begin
  Tree := GetTree(10, 0);
  WriteLn(FindMostLeftLeaf(Tree));
end;
 
begin
  GetTestResults;
end.

Leave a Comment

− 3 = 1