已知一棵二叉树的前序和中序遍历结果,输出后序遍历结果。哪位同学能写一下程序注释,尤其是4个参数的意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知一棵二叉树的前序和中序遍历结果,输出后序遍历结果。哪位同学能写一下程序注释,尤其是4个参数的意义相关的知识,希望对你有一定的参考价值。

源程序如下:(我是学pascal的,其他语言的不要,不好意思了~~~)
program tree(input, output);
var s1, s2 : string;
procedure try(l1, r1, l2, r2 : integer);
var m : integer;
begin
m := pos(s1[l1], s2);
if m > l2 then try(l1 + 1, l1 + m - l2, l2, m - 1);
if m < r2 then try(l1 + m - l2 + 1, r1, m + 1, r2);
write(s1[l1])
end;
begin
readln(s1);
readln(s2);
try(1, length(s1), 1, length(s2));
writeln
end.

首先明确:一颗二叉树的前序遍历=根节点+左子树前序遍历 +右子树前序遍历
一颗二叉树的中序遍历=左子树中序遍历+根节点+右子树中序遍历
那么从前序遍历中取第一个点,就是根节点,知道了根节点,就可以找到中序遍历中跟节点的位置,那么就可以在中序遍历中找到左子树和右子树。
program tree(input, output);
var s1, s2 : string;
procedure try(l1, r1, l2, r2 : integer); 制造前序遍历为s1[l1] 至 s1[r1],中序遍历为s2[l2] 至s2[r2]的树
var m : integer;
begin
m := pos(s1[l1], s2);
s1[l1]就是根节点,那么就可以在中序遍历s2中找到根节点,m就是根节点在 中序遍历中的位置,根节点m前面的是左子树的中序遍历,后面的是右子树的中序遍历
if m > l2 then try(l1 + 1, l1 + m - l2, l2, m - 1); 递归处理左子树
if m < r2 then try(l1 + m - l2 + 1, r1, m + 1, r2); 递归处理右子树
write(s1[l1]) 输出当前根节点
end;
begin
readln(s1);
readln(s2);
try(1, length(s1), 1, length(s2));
一开始是对整个s1(前序遍历),整个s2(后续遍历)进行处理
writeln
end.

可以画个图看看,会明白的。
祝lz学业有成!
参考技术A //只有先序遍历,其它的可以在这个基础上改。
//如果有不懂的可以hi我
#include<stdio.h>
#include<stdlib.h>
typedef struct tnode

char data;
struct tnode *lchild;
struct tnode *rchild;

tnode;
tnode *Tree_creat(tnode *t)

char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else

if(!(t=(tnode *)malloc(sizeof(tnode))))
printf("Error!");
t->data=ch;//printf("[%c]",t->data);
t->lchild=Tree_creat(t->lchild);
t->rchild=Tree_creat(t->rchild);

return t;



void preorder(tnode *t)

if(t!=NULL)

printf("%c ",t->data);

preorder(t->lchild);
preorder(t->rchild);




void main()

tnode *t=NULL;
t=Tree_creat(t);
preorder(t);

追问

pascal。。。不好意思

参考资料:百度一下

参考技术B //如果有不懂的可以hi我
#include<stdio.h>
#include<stdlib.h>
typedef struct tnode

char data;
struct tnode *lchild;
struct tnode *rchild;

tnode;
tnode *Tree_creat(tnode *t)

char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else

if(!(t=(tnode *)malloc(sizeof(tnode))))
printf("Error!");
t->data=ch;//printf("[%c]",t->data);
t->lchild=Tree_creat(t->lchild);
t->rchild=Tree_creat(t->rchild);

return t;



void preorder(tnode *t)

if(t!=NULL)

printf("%c ",t->data);

preorder(t->lchild);
preorder(t->rchild);




void main()

tnode *t=NULL;
t=Tree_creat(t);
preorder(t);

以上是关于已知一棵二叉树的前序和中序遍历结果,输出后序遍历结果。哪位同学能写一下程序注释,尤其是4个参数的意义的主要内容,如果未能解决你的问题,请参考以下文章

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列

[codevs1029]遍历问题

递归与递推遍历问题

构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果

遍历问题 codevs

已知一棵二叉树的中序和前序序列如下,求该二叉树的后序序列,并画出二叉树