with Ada.Text_IO; use Ada.Text_IO;
package body binarysearchtree is
function toLower (c : character) return character renames Ada.characters.handling.to_lower;
-- tolower - translates all alphabetic, uppercase characters
-- in str to lowercase
function toLower (Str : String10) return String is
convert : String (str'Range);
begin
for x in convert'Range loop
convert (x) := toLower (str (x));
end loop;
return convert;
end toLower;
procedure InsertBinarySearchTree(Root: in out BinarySearchTreePoint; custName: in String10; custPhone: String10 ) is
p:binarySearchTreePoint:=root;
q:binarySearchTreePoint:=root;
t:binarySearchTreePoint;
begin
t:=new node;
t.info.name:=custName;
t.info.phoneNumer:=custPhone;
t.rTag := true;
t.rLink:=t;
t.lTag:=false;
t.rLink:=t;
if root = null then
root:=t;
else
loop
if q/=null then
if toLower(custName) < toLower(q.info.name) then
if q.lLink=p then
p:=q;
exit;
end if;
p:=q;
q:=q.lLink;
elsif q.rTag = true then
p:=q;
q:=q.rLink;
else
p:=q;
exit;
end if;
else
exit;
end if;
end loop;
if toLower(p.info.name) > toLower(custName) then
t.lLink:=p.lLink;
p.lTag := true;
t.rLink:=p;
t.rTag:=false;
if t.lTag=true then
t.lLink.rLink:=t; --check for child and rethread tree
end if;
elsif toLower(p.info.name) <= toLower(custName) then
p.rLink:=t;
p.rTag:=true;
t.lLink:=p;
t.lTag:=false;
if t.rTag=true then
t.rLink.lLink:=t; --check for child and rethread tree
end if;
end if;
end if;
end InsertBinarySearchTree;
-- This procedure locates a customer using a binary search. A pointer is returned to the
-- customer record if they exist, otherwise a Null pointer is returned (in CustomerPoint).
-- The search must be implemented iteratively.
procedure FindCustomerIterative(Root: in BinarySearchTreePoint; CustomerName: in String10; CustomerPoint: out BinarySearchTreePoint) is
p:binarySearchTreePoint:=root;
begin
loop
if p=null then
customerPoint:=p;
exit;
elsif toLower(p.info.name) = toLower(custName) then
customerPoint:=p;
exit;
elsif toLower(p.info.name) > toLower(custName) then
p:=p.lLink;
elsif toLower(p.info.name) <= toLower(custName) then
p:=p.rLink;
end if;
end loop;
end FindCustomerIterative;
-- This procedure locates a customer using a binary search. A pointer is returned to the
-- customer record if they exist, otherwise a Null pointer is returned (in CustomerPoint).
-- The search must be implemented recursively.
procedure FindCustomerRecursive(Root: in BinarySearchTreePoint; CustomerName: in String10; CustomerPoint: out BinarySearchTreePoint) is
p:binarysearchtreepoint;
begin
p:=root;
if p /= null then
if p.lTtag = True then
FindCustomerRecursive(p.Llink,customername);
end if;
if p.info.name = customername then
customerPoint:=p;
return;
end if;
if p.rTag = True then
FindCustomerRecursive(p.Rlink,customername);
end if;
end if;
end FindCustomerRecursive;
-- This function returns the address of the next node in “inorder†taking advantage of threads.
-- The user may enter the tree at any random location. This is sometimes called an iteration
-- function or iterater (no recursion).
function InOrderSuccessor(TreePoint: in BinarySearchTreePoint) return BinarySearchTreePoint is
p:binarySearchTreePoint;
q:binarySearchTreePoint;
begin
p:=treePoint;
q := p.rLink;
if p.rTag = false then
p:=q;
else
while q.lTag = true loop
q := q.lLink;
end loop;
p:=q;
end if;
return p;
end InOrderSuccessor;
-- Access functions to return customer names and phone numbers.
function CustomerName(TreePoint: in BinarySearchTreePoint) return String10 is
begin
return treePoint.info.name;
end customerName;
function CustomerPhone(TreePoint: in BinarySearchTreePoint) return String10 is
begin
return treePoint.info.phoneNumber;
end customerPhone;
end binarysearchtree;