虚心接受各位大牛的批评指正!!!
二叉树遍历的基本知识:
前序遍历:根-左-右
中序遍历:左-根-右
后序遍历:左-右-根
对于已知二叉树的前序和中序遍历,求二叉树的后序遍历:
例如,给定前序遍历为ABCDEFGH,中序遍历为CBEDAGHF,求它的后序遍历。
分析:
因为后序遍历的顺序是左-右-根,因此,可以先通过前序遍历找到根,然后通过中序遍历可以找到根的左子树和右子树,待这两个树都处理完后,再输出根结点。
因此,先在前序遍历中找到A,通过中序遍历确定了A的位置,由此得A的左子树为CBED,而前序遍历对应过来是BCDE,再找到根B,得B
的左子树为C,前序遍历C为根,因为C的左子树为空,右子树也为空,因此C为第一个出现的根。
所以B的左子树处理完毕,再处理B的右子树为ED,通过前序遍历找到对应的为DE,所以D为根,确定D为根后,处理D的左子树E,对应会前序遍历为根E,E的左子树与右子树处理完毕,E为第二个出现的根。
D的左子树已处理完毕,右子树E也处理完毕,D为第三个出现的根。
则根B的左子树C已处理完毕,根B的右子树DE也已处理完毕,则根B已处理完毕,B为第四个出现的根。
由此,A的左子树已处理完毕,现在处理A的右子树。同样,找到中序为GHF对应的前序为FGH,因此F为右子树的根,对应回去GH为F的左子树,再在前序中找到GH,G为F左子树的根,找G的左子树为空,找G的右子树为H,对应为H为G的右子树的根,再找,H的左子树不存在,右子树也不存在,H处理完毕,为第五个出现的根。
因为G的左子树为空,右子树H已处理完毕,G处理完毕,G为第六个出现的根。
F的左子树处理完毕,右子树为空,那么F处理完毕,F为第七个出现的根。
最后A的左子树CBED处理完毕,右子树GHF处理完毕,A处理完毕,A为第八个出现的根。
综上,前序遍历为ABCDEFGH,中序遍历为CBEDAGHF的二叉树的后序遍历已经求得,为CEDBHGFA
CODE:
var sx,sz:sting; procedure work(sx,sz:string); var l,k:longint; begin if sx<>’’ then begin l:=length(sx); k:=pos(sx[1],sz); work(copy(sx,2,k-1),copy(sz,1,k-1)); work(copy(sx,k+1,l-k),copy(sx,k+1,l-k)); write(sx[1]); end; end; begin readln(sx); readln(sz); work(sx,sz); end.
对于已知二叉树的中序和后序遍历,求二叉树的前序遍历:
例如,给定中序遍历为BADCE,后序遍历为BDECA,求它的前序遍历。
分析:
基本同上,不同的是,后序遍历的顺序为左-右-根,因此通过找后序遍历的最后一项在把它放入中序遍历中就能找到它的左子树和右子树,然后依次递归求解。
CODE:
var sx,sz:string; procedure work(sx,sz:string); var l,k:longint; begin if sz<>’’ then begin l:=length(sz); k:=pos(sz[l],sx); write(sz[l]); work(copy(sx,1,k-1),copy(sz,1,k-1)); work(copy(sx,k+1,l-k),copy(sz,k,l-k)); end; end; begin readln(sx); readln(sz); work(sx,sz); end.