public class nine_2008_2009_2011 {
//在中序中找到根的位置
private static int findRootOfIn(char root, char[] in, int startPos, int endPos) {
int pos; //中序的根
for( pos = startPos; pos <= endPos; pos++) {
if(in[pos] == root)
break;
}
return pos;
}
/**
* 根据前中序输出后续
* @param pre 前序序列
* @param preStart 前序开始位置
* @param preEnd 前序终止位置
* @param in 中序序列
* @param inStart 中序开始位置
* @param inEnd 中序结束位置
*/
private static void postOrder(char[] pre, int preStart, int preEnd, char[] in, int inStart, int inEnd) {
char root; //根节点
int rootPos; //根节点所在位置
int leftLen, rightLen; //左右节点子树长度
//当前二叉树只有一个节点
if(inStart == inEnd) {
System.out.print(in[inStart]);
}else {
root = pre[preStart]; //当前二叉树的根节点
rootPos = findRootOfIn(root, in, inStart, inEnd); //当前二叉树根节点所在位置
//计算左右子树节点数
leftLen = rootPos - inStart;
rightLen = inEnd - rootPos;
//分割左子树
if(leftLen > 0) {
postOrder(pre, preStart+1, preStart+leftLen, in, inStart, rootPos-1);
}
//分割右子树
if(rightLen > 0) {
postOrder(pre, preEnd-rightLen+1, preEnd, in, rootPos+1, inEnd);
}
//输出
System.out.print(root);
}
}
public static void main(String[] args) {
char[] pre = {'A', 'B', 'D', 'E', 'C', 'F', 'G'};
char[] in = {'D', 'B', 'E', 'A', 'C', 'G', 'F'};
System.out.print("后序序列为:");
postOrder(pre, 0, pre.length-1, in, 0, in.length-1);
}
}
转载于:https://my.oschina.net/chenmoxuan/blog/1786711