上一篇写到了如何构建一棵树并打印出他的四种遍历,今天按着上一次的代码接着写已知先序遍历和中序遍历,求后序遍历。
只要确定了中序遍历,加上另外一种遍历,我们就可以构造出一棵树
//已知前序中序求后序遍历
//先求出树的原型
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 instart, int inend) {
for (int i = instart; i <= inend; i++) {
if(inOrder[i] == rootData){
return i;
}
}
return -1;
}
测试类:
public static void main(String[] args) {
int[] preOrder = {1,2,4,8,9,5,10,3,6,7};
int[] inOrder = {8,4,9,2,10,5,1,6,3,7};
ConstructTree tree = new ConstructTree();
Node root = tree.initTree(preOrder, 0, preOrder.length-1, inOrder, 0,inOrder.length-1);
System.out.println("二叉树后序遍历");
tree.postOrder(root);
}
输出:
二叉树后序遍历
8 9 4 10 5 2 6 7 3 1