program ideone;
{$mode objfpc}{$H+}
uses
Classes;
type
TElem=integer;
PNode=^TNode;
TNode=record
data:TElem;
prev,next:PNode;
end;
TList=record
head,tail:PNode;
end;
PBranch=^TBranch;
TBranch=record
data:TElem;
lf,rt,up:PBranch;
end;
TTree=record
root:PBranch;
end;
procedure appendList(var list:TList;data:TElem);
var curr:PNode;
begin
New(curr);
curr^.data:=data;
curr^.prev:=list.tail;
curr^.next:=nil;
if list.tail<>nil then list.tail^.next:=curr
else list.head:=curr;
list.tail:=curr;
end;
procedure ShowForward(list:TList);
var curr:PNode;
begin
curr:=list.head;
while curr<>nil do
begin
Write(curr^.data,' ');
curr:=curr^.next;
end;
WriteLn;
end;
procedure ShowBackward(list:TList);
var curr:PNode;
begin
curr:=list.tail;
while curr<>nil do
begin
Write(curr^.data,' ');
curr:=curr^.prev;
end;
WriteLn;
end;
procedure _appendTree(data:TElem;var branch:PBranch;up:PBranch=nil);
begin
if branch=nil then
begin
New(branch);
branch^.data:=data;
branch^.lf:=nil;
branch^.rt:=nil;
branch^.up:=up;
end
else if branch^.data>data then _appendTree(data,branch^.lf,branch)
else if branch^.data<data then _appendTree(data,branch^.rt,branch)
else ;
end;
procedure appendTree(var tree:TTree;data:TElem);
begin
_appendTree(data,tree.root);
end;
function makeTestTree:TTree;
var x:TElem;
const data:array[0..10]of TElem=(6,2,9,1,4,7,11,3,5,8,10);
begin
Result.root:=nil;
for x in data do appendTree(Result,x);
end;
procedure inorderTree(curr:PBranch);
begin
if curr=nil then Exit;
inorderTree(curr^.lf);
Write(curr^.data,' ');
inorderTree(curr^.rt);
end;
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;
procedure Test;
var tree:TTree;
var list:TList;
begin
tree:=makeTestTree;
inorderTree(tree.root);
WriteLn;
list:=treeToList(tree);
ShowForward(list);
ShowBackward(list);
end;
begin
Test;
end.
cHJvZ3JhbSBpZGVvbmU7Cgp7JG1vZGUgb2JqZnBjfXskSCt9Cgp1c2VzCiAgQ2xhc3NlczsKCnR5cGUKICBURWxlbT1pbnRlZ2VyOwogIFBOb2RlPV5UTm9kZTsKICBUTm9kZT1yZWNvcmQKICAgIGRhdGE6VEVsZW07CiAgICBwcmV2LG5leHQ6UE5vZGU7CiAgZW5kOwogIFRMaXN0PXJlY29yZAogICAgaGVhZCx0YWlsOlBOb2RlOwogIGVuZDsKICBQQnJhbmNoPV5UQnJhbmNoOwogIFRCcmFuY2g9cmVjb3JkCiAgICBkYXRhOlRFbGVtOwogICAgbGYscnQsdXA6UEJyYW5jaDsKICBlbmQ7CiAgVFRyZWU9cmVjb3JkCiAgICByb290OlBCcmFuY2g7CiAgZW5kOwoKcHJvY2VkdXJlIGFwcGVuZExpc3QodmFyIGxpc3Q6VExpc3Q7ZGF0YTpURWxlbSk7CnZhciBjdXJyOlBOb2RlOwpiZWdpbgogIE5ldyhjdXJyKTsKICBjdXJyXi5kYXRhOj1kYXRhOwogIGN1cnJeLnByZXY6PWxpc3QudGFpbDsKICBjdXJyXi5uZXh0Oj1uaWw7CiAgaWYgbGlzdC50YWlsPD5uaWwgdGhlbiBsaXN0LnRhaWxeLm5leHQ6PWN1cnIKICBlbHNlIGxpc3QuaGVhZDo9Y3VycjsKICBsaXN0LnRhaWw6PWN1cnI7CmVuZDsKCnByb2NlZHVyZSBTaG93Rm9yd2FyZChsaXN0OlRMaXN0KTsKdmFyIGN1cnI6UE5vZGU7CmJlZ2luCiAgY3Vycjo9bGlzdC5oZWFkOwogIHdoaWxlIGN1cnI8Pm5pbCBkbwogIGJlZ2luCiAgICBXcml0ZShjdXJyXi5kYXRhLCcgJyk7CiAgICBjdXJyOj1jdXJyXi5uZXh0OwogIGVuZDsKICBXcml0ZUxuOwplbmQ7Cgpwcm9jZWR1cmUgU2hvd0JhY2t3YXJkKGxpc3Q6VExpc3QpOwp2YXIgY3VycjpQTm9kZTsKYmVnaW4KICBjdXJyOj1saXN0LnRhaWw7CiAgd2hpbGUgY3Vycjw+bmlsIGRvCiAgYmVnaW4KICAgIFdyaXRlKGN1cnJeLmRhdGEsJyAnKTsKICAgIGN1cnI6PWN1cnJeLnByZXY7CiAgZW5kOwogIFdyaXRlTG47CmVuZDsKCnByb2NlZHVyZSBfYXBwZW5kVHJlZShkYXRhOlRFbGVtO3ZhciBicmFuY2g6UEJyYW5jaDt1cDpQQnJhbmNoPW5pbCk7CmJlZ2luCiAgaWYgYnJhbmNoPW5pbCB0aGVuCiAgYmVnaW4KICAgIE5ldyhicmFuY2gpOwogICAgYnJhbmNoXi5kYXRhOj1kYXRhOwogICAgYnJhbmNoXi5sZjo9bmlsOwogICAgYnJhbmNoXi5ydDo9bmlsOwogICAgYnJhbmNoXi51cDo9dXA7CiAgZW5kCiAgZWxzZSBpZiBicmFuY2heLmRhdGE+ZGF0YSB0aGVuIF9hcHBlbmRUcmVlKGRhdGEsYnJhbmNoXi5sZixicmFuY2gpCiAgZWxzZSBpZiBicmFuY2heLmRhdGE8ZGF0YSB0aGVuIF9hcHBlbmRUcmVlKGRhdGEsYnJhbmNoXi5ydCxicmFuY2gpCiAgZWxzZSA7CmVuZDsKCnByb2NlZHVyZSBhcHBlbmRUcmVlKHZhciB0cmVlOlRUcmVlO2RhdGE6VEVsZW0pOwpiZWdpbgogIF9hcHBlbmRUcmVlKGRhdGEsdHJlZS5yb290KTsKZW5kOwoKZnVuY3Rpb24gbWFrZVRlc3RUcmVlOlRUcmVlOwp2YXIgeDpURWxlbTsKY29uc3QgZGF0YTphcnJheVswLi4xMF1vZiBURWxlbT0oNiwyLDksMSw0LDcsMTEsMyw1LDgsMTApOwpiZWdpbgogIFJlc3VsdC5yb290Oj1uaWw7CiAgZm9yIHggaW4gZGF0YSBkbyBhcHBlbmRUcmVlKFJlc3VsdCx4KTsKZW5kOwoKcHJvY2VkdXJlIGlub3JkZXJUcmVlKGN1cnI6UEJyYW5jaCk7CmJlZ2luCiAgaWYgY3Vycj1uaWwgdGhlbiBFeGl0OwogIGlub3JkZXJUcmVlKGN1cnJeLmxmKTsKICBXcml0ZShjdXJyXi5kYXRhLCcgJyk7CiAgaW5vcmRlclRyZWUoY3Vycl4ucnQpOwplbmQ7CgpmdW5jdGlvbiB0cmVlVG9MaXN0KHRyZWU6VFRyZWUpOlRMaXN0Owp2YXIgY3VycjpQQnJhbmNoOwpiZWdpbgogIFJlc3VsdC5oZWFkOj1uaWw7CiAgUmVzdWx0LnRhaWw6PW5pbDsKICBjdXJyOj10cmVlLnJvb3Q7CiAgaWYgY3Vycj1uaWwgdGhlbiBFeGl0OwogIHdoaWxlIGN1cnJeLmxmPD5uaWwgZG8gY3Vycjo9Y3Vycl4ubGY7CiAgd2hpbGUgY3Vycjw+bmlsIGRvCiAgYmVnaW4KICAgIGFwcGVuZExpc3QoUmVzdWx0LGN1cnJeLmRhdGEpOwogICAgaWYgY3Vycl4ucnQ8Pm5pbCB0aGVuCiAgICBiZWdpbgogICAgICBjdXJyOj1jdXJyXi5ydDsKICAgICAgd2hpbGUgY3Vycl4ubGY8Pm5pbCBkbyBjdXJyOj1jdXJyXi5sZjsKICAgIGVuZAogICAgZWxzZQogICAgYmVnaW4KICAgICAgd2hpbGUgKGN1cnJeLnVwPD5uaWwpYW5kKGN1cnJeLnVwXi5ydD1jdXJyKSBkbyBjdXJyOj1jdXJyXi51cDsKICAgICAgY3Vycjo9Y3Vycl4udXA7CiAgICBlbmQ7CiAgZW5kOwplbmQ7Cgpwcm9jZWR1cmUgVGVzdDsKdmFyIHRyZWU6VFRyZWU7CnZhciBsaXN0OlRMaXN0OwpiZWdpbgogIHRyZWU6PW1ha2VUZXN0VHJlZTsKICBpbm9yZGVyVHJlZSh0cmVlLnJvb3QpOwogIFdyaXRlTG47CiAgbGlzdDo9dHJlZVRvTGlzdCh0cmVlKTsKICBTaG93Rm9yd2FyZChsaXN0KTsKICBTaG93QmFja3dhcmQobGlzdCk7CmVuZDsKCmJlZ2luCiAgVGVzdDsKZW5kLgo=