请教,如何在知道中序和前序遍历的情况下,得到后序遍历的结果? 不需要程序,有个图就行。 谢谢。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教,如何在知道中序和前序遍历的情况下,得到后序遍历的结果? 不需要程序,有个图就行。 谢谢。相关的知识,希望对你有一定的参考价值。
相当于根据中序和前序结果重新构造二叉树,然后再做后序遍历得到结果,当然实际程序中不需要真的构建那个二叉树。重新构造的算法是:
前序结果的第一个节点必定是根节点,然后到中序结果中查找这个根节点,他之前的是左子树中序,之后的是右子树中序;然后到前序结果中查找到所有左子树节点的前序,以及所有右子树节点的前序。然后对左子树和右子树进行同样的操作,直到叶子节点。 参考技术A 首先明确:一颗二叉树的前序遍历=根节点+左子树前序遍历 +右子树前序遍历
一颗二叉树的中序遍历=左子树中序遍历+根节点+右子树中序遍历
那么从前序遍历中取第一个点,就是根节点,知道了根节点,就可以找到中序遍历中跟节点的位置,那么就可以在中序遍历中找到左子树和右子树。
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.
可以画个图看看,会明白的。
祝lz学业有成!
以上是关于请教,如何在知道中序和前序遍历的情况下,得到后序遍历的结果? 不需要程序,有个图就行。 谢谢。的主要内容,如果未能解决你的问题,请参考以下文章
[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总