RT
用先序遍历+递归+链式存储
最好基本框架和源程序都有
多谢
RT
用先序遍历+递归+链式存储
最好基本框架和源程序都有
多谢
已知先序中序:
procedure Solve(pre,mid:string);
var i:integer;
begin
if (pre='') or (mid='') then exit;
i:=pos(pre[1],mid);
solve(copy(pre,2,i),copy(mid,1,i-1));
solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i));
post:=post+pre[1]; {加上根,递归结束后post即为后序遍历}
end;
已知中序后序:
procedure Solve(mid,post:string);
var i:integer;
begin
if (mid='') or (post='') then exit;
i:=pos(post[length(post)],mid);
pre:=pre+post[length(post)]; {加上根,递归结束后pre即为前序遍历}
solve(copy(mid,1,I-1),copy(post,1,I-1));
solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i));
end;
已知先序后序:
function ok(s1,s2:string):boolean;
var i,l:integer; p:boolean;
begin
ok:=true;
l:=length(s1);
for i:=1 to l do begin
p:=false;
for j:=1 to l do
if s1[i]=s2[j] then p:=true;
if not p then begin
ok:=false;exit;
end;
end;^
end;
procedure solve(pre,post:string);
var i:integer;
begin
if (pre='') or (post='') then exit;
i:=0;
repeat
inc(i);
until ok(copy(pre,2,i),copy(post,1,i));
solve(copy(pre,2,i),copy(post,1,i));
midstr:=midstr+pre[1];
solve(copy(pre,i+2,length(pre)-i-1),
copy(post,i+1,length(post)-i-1));
end;
给出一棵二叉树的中序与后序排列。求出它的先序排列。
[分析] 通过对比二叉树的中序与后序排列,我们可以找出根节点及左右子树。同样的,有可以通过对比左子树的中序与后序排列,找出左子树的根节点……可见,该问题能够被递归描述。当找到最后一个根节点时,递归无法再进行下去,这就是递归结束的边界条件。由此可见,递归算法中常常隐含了分治思想。程序如下:
program chu01_3;
var z,h: string;
procedure find(a,b:string);
var
s,l : integer;
begin
l:=length(b);
if l=1 then Write(b) {边界条件及递归返回段}
else
begin {递归前进段}
Write(b[l]);
s:=pos(b[l],a);
if s-1>0 then find(copy(a,1,s-1),copy(b,1,s-1)); {递归左子树}
if l-s>0 then find(copy(a,s+1,l-s),copy(b,s,l-s)); {递归右子树}
end;
end;
begin
Readln(z);
Readln(h);
Find(z,h);
Readln;
end.
链式存储就不要举例子了吧……太容易了