,到二叉树的中序序列中,查到该结点,该结点将二叉树分为“左根右”三部分。若左、右子树均有,则层次序列根结点的后面应是左右子树的根;若中序序列中只有左子树或只有右子树,则在层次序列的根结点后也只有左子树的根或右子树的根。这样,定义一个全局变量指针R,指向层次序列待处理元素。算法中先处理根结点,将根结点和左右子女的信息入队列。然后,在队列不空的条件下,循环处理二叉树的结点。队列中元素的数据结构定义如下:r
typedefstructr
i
tlvl层次序列指针,总是指向当前“根结点”在层次序列中的位置r
i
tlh中序序列的下上界r
i
tf层次序列中当前“根结点”的双亲结点的指针r
i
tlr1双亲的左子树2双亲的右子树r
q
oder
BiTreeCreatdatatypei
leveli
t
r
由二叉树的层次序列level
和中序序列i
生成二叉树。
是二叉树的结点数r
if
1pri
tf“参数错误
”exit0r
q
odesQQ是元素为q
ode类型的队列,容量足够大r
i
itQi
tR0R是层次序列指针,指向当前待处理的结点r
BiTreepBiTreemallocsizeofBiNode生成根结点r
pdatalevel0plchild
ullprchild
ull填写该结点数据r
fori0i
i在中序序列中查找根结点,然后,左右子女信息入队列r
ifi
ilevel0breakr
ifi0根结点无左子树,遍历序列的1
1是右子树r
plchild
ullr
slvlRsli1sh
1sfpslr2e
queueQsr
r
elseifi
1根结点无右子树,遍历序列的1
1是左子树r
prchild
ullr
slvlRsl1shi1sfpslr1e
queueQsr
r
else根结点有左子树和右子树r
slvlRsl0shi1sfpslr1e
queueQs左子树有关信息入队列r
slvlRsli1sh
1sfpslr2e
queueQs右子树有关信息入队列r
r
whileemptyQ当队列不空,进行循环,构造二叉树的左右子树r
sdelqueueQfathersfr
forislishir
ifi
ilevelslvlbreakr
pbitreptrmallocsizeofbi
ode申请结点空间r
pdatalevelslvlplchild
ullprchild
ull填写该结点数据r
ifslr1fatherlchildpr
elsefatherrchildp;让双亲的子女指针指向该结点r
ifislr
plchild
ull处理无左子女r
slvlRsli1sfpslr2e
queueQsr
r
elseifishr
prchild
ull处理无右子女r
slvlRshi1sfpslr1e
queueQsr
r
elseslvlRshi1sfpslr1e
queueQs左子树有关信息入队列r
slvlRsli1sfpslr2e
queueQs右子树有关信息入队列r
r
结r