java实现已知先序遍历和中序遍历,求后序遍历

上一篇写到了如何构建一棵树并打印出他的四种遍历,今天按着上一次的代码接着写已知先序遍历和中序遍历,求后序遍历。

只要确定了中序遍历,加上另外一种遍历,我们就可以构造出一棵树

//已知前序中序求后序遍历
		//先求出树的原型
		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 

 

你可能感兴趣的:(数据结构,算法,java基础)