Skip to content

Commit

Permalink
DivideLeft, DivideRight
Browse files Browse the repository at this point in the history
  • Loading branch information
JulStrat committed Apr 15, 2019
1 parent 341c430 commit 18371ea
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 10 deletions.
35 changes: 29 additions & 6 deletions ftreap.pas
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ generic TTreapNode<T> = class
class function Meld(l, r: TTreapNode): TTreapNode;

(* Divides tree into two trees. Where @code(Max(l) <= k). *)
class procedure Divide(node: TTreapNode; k: T; var l, r: TTreapNode);
class procedure DivideRight(node: TTreapNode; k: T; var l, r: TTreapNode);

(* Divides tree into two trees. Where @code(Max(l) < k). *)
class procedure DivideLeft(node: TTreapNode; k: T; var l, r: TTreapNode);

(* Divides tree into two trees. Where @code(Size(l) = pos). *)
class procedure DivideAt(node: TTreapNode; const pos: SizeUInt;
Expand Down Expand Up @@ -214,8 +217,7 @@ class procedure TTreapNode.DivideAt(node: TTreapNode; const pos: SizeUInt;
UpdateSize(node)
end;

// DivideRight
class procedure TTreapNode.Divide(node: TTreapNode; k: T; var l, r: TTreapNode);
class procedure TTreapNode.DivideRight(node: TTreapNode; k: T; var l, r: TTreapNode);
begin
if node = nil then
begin
Expand All @@ -225,13 +227,34 @@ class procedure TTreapNode.Divide(node: TTreapNode; k: T; var l, r: TTreapNode);
end;
if k < node.FKey then
begin
Divide(node.FLeft, k, l, node.FLeft);
DivideRight(node.FLeft, k, l, node.FLeft);
r := node;
end
else
begin
Divide(node.FRight, k, node.FRight, r);
DivideRight(node.FRight, k, node.FRight, r);
l := node;
end;
UpdateSize(node);
end;

class procedure TTreapNode.DivideLeft(node: TTreapNode; k: T; var l, r: TTreapNode);
begin
if node = nil then
begin
l := nil;
r := nil;
Exit;
end;
if k > node.FKey then
begin
DivideLeft(node.FRight, k, node.FRight, r);
l := node;
end
else
begin
DivideLeft(node.FLeft, k, l, node.FLeft);
r := node;
end;
UpdateSize(node);
end;
Expand All @@ -241,7 +264,7 @@ class procedure TTreapNode.Insert(var node: TTreapNode; const k: T); inline;
l: TTreapNode = nil;
r: TTreapNode = nil;
begin
Divide(node, k, l, r);
DivideRight(node, k, l, r);
node := Meld(l, Meld(TTreapNode.Create(k), r));
end;

Expand Down
45 changes: 41 additions & 4 deletions ftreapapp.lpr
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
MAX_KEY = 1000;

var
ra: TIntTreapNode = nil;
ra, ln, rn: TIntTreapNode;
ria: TImpIntTreapNode = nil;
ta: array of longint;
i, j: longint;
Expand Down Expand Up @@ -122,7 +122,42 @@
Assert(ra = nil);
Assert(TIntTreapNode.GetSize(ra) = 0);

for i := 0 to NODES_NUM - 1 do
begin
TIntTreapNode.Insert(ra, ta[i]);
end;
WriteLn('DivideRight test ...');
for i := 0 to NODES_NUM - 1 do
begin
TIntTreapNode.DivideRight(ra, ta[i], ln, rn);
Assert(TIntTreapNode.Contains(ln, ta[i]));
Assert(not TIntTreapNode.Contains(rn, ta[i]));
ra := TIntTreapNode.Meld(ln, rn);
end;

WriteLn('Check treap structure - ', TIntTreapNode.CheckStucture(ra));
WriteLn('Size - ', TIntTreapNode.GetSize(ra));

WriteLn('DivideLeft test ...');
for i := 0 to NODES_NUM - 1 do
begin
TIntTreapNode.DivideLeft(ra, ta[i], ln, rn);
Assert(TIntTreapNode.Contains(rn, ta[i]));
Assert(not TIntTreapNode.Contains(ln, ta[i]));
ra := TIntTreapNode.Meld(ln, rn);
end;

WriteLn('Check treap structure - ', TIntTreapNode.CheckStucture(ra));
WriteLn('Size - ', TIntTreapNode.GetSize(ra));

TIntTreapNode.DestroyTreap(ra);
Assert(ra = nil);
Assert(TIntTreapNode.GetSize(ra) = 0);

WriteLn('-----------------------');
WriteLn('Implicit Treap test ...');
WriteLn('-----------------------');

for i := 0 to NODES_NUM - 1 do
begin
TImpIntTreapNode.InsertAt(ria, 0, ta[i]);
Expand All @@ -147,9 +182,11 @@
end;
WriteLn('RemoveAt PASSED...');

Assert(ra = nil);
Assert(TIntTreapNode.GetSize(ra) = 0);
Assert(ria = nil);
Assert(TImpIntTreapNode.GetSize(ria) = 0);
TImpIntTreapNode.DestroyTreap(ria);
//ReadLn();


ReadLn();

end.

0 comments on commit 18371ea

Please sign in to comment.