上一篇写到了如何构建一棵树并打印出他的四种遍历,今天按着上一次的代码接着写已知先序遍历和中序遍历,求后序遍历。
只要确定了中序遍历,加上另外一种遍历,我们就可以构造出一棵树
//已知前序中序求后序遍历
//先求出树的原型
public Node initTree(int[] preOrder,int pstart,int pend,int[] inOrder,int instart,int inend){
if(pstart > pend || instart > inend){
return null;
}
int rootData = preOrder[pstart];
Node head = new Node(rootData);
//根据中序找到根节点所在位置(左边为左子树,右边为右子树)
int rootIndex = findIndexInArray(inOrder,rootData,instart,inend);
int offSet = rootIndex-instart-1;
//构建左子树
Node left = initTree(preOrder,pstart+1,pstart+offSet+1,inOrder,instart,instart+offSet);
//构建右子树
Node right = initTree(preOrder,pstart+offSet+2,pend,inOrder,rootIndex+1,inend);
head.left = left;
head.right = right;
return head;
}
//中序根节点位置
private int findIndexInArray(int[] inOrder, int rootData, int