1. 程式人生 > >已知二叉樹前序,中序遍歷,求後序遍歷,java實現

已知二叉樹前序,中序遍歷,求後序遍歷,java實現

  簡單介紹一下思想,先看前序,前序遍歷的第一個節點,就是該樹的根。在中序中找到該根的位置,設為index,在中序遍歷集合中,位於index之前的屬於根的左子樹,位於index之後的屬於根的右子樹。然後,對左右子數,遍歷的呼叫該過程,就能將樹結構還原。之後後序遍歷也就不是問題了。
public class M {
	public static class Tree{
		public int value;
		public Tree left;
		public Tree right;
		public Tree(int value) {
			this.value=value;
		}
	}
	public static void main(String[] args){
		int[]preOrder={1,2,4,5,3,6,7};
		int[]midOrder={4,2,5,1,6,3,7};
		getBehindOrder(preOrder, midOrder);
	}
	public static void getBehindOrder(int[]pre,int[]mid){
		if (pre==null||mid==null||pre.length!=mid.length) {
			return;
		}
		Tree root=buildTree(pre, mid);
		behindOrder(root);
	}
	
	public static void behindOrder(Tree root){//後序遍歷二叉樹
		if (root==null) {
			return;
		}
		if (root.left!=null) {
			behindOrder(root.left);
		}
		if (root.right!=null) {
			behindOrder(root.right);
		}
		System.out.print(root.value+" ");
		
	}
	public static Tree buildTree(int[]preOrder,int[]midOrder){//根據前序和中序,建立二叉樹
		int value=preOrder[0];
		int length=preOrder.length;
		Tree root=new Tree(value);
		root.left=root.right=null;
		if (preOrder.length==1) {
			return root;
		}
		int index=0;
		while(midOrder[index]!=value)
			index++;//此處還要考慮index==length-1的情況
		if (index>0) {
			//中序中,根節點左邊的節點都屬於左子樹
			int[]leftSubPreOrder=new int[index];
			for(int i=0;i<leftSubPreOrder.length;i++){
				leftSubPreOrder[i]=preOrder[i+1];
			}
			int[]leftSubMidOrder=new int[index];
			for(int i=0;i<leftSubMidOrder.length;i++){
				leftSubMidOrder[i]=midOrder[i];
			}
			root.left=buildTree(leftSubPreOrder, leftSubMidOrder);
		}
		
		
		if(length-index-1>0){
		int[]rightSubMidOrder=new int[length-index-1];
		for(int i=0;i<rightSubMidOrder.length;i++){
			rightSubMidOrder[i]=midOrder[i+index+1];
		}
		int[]rightSubPreOrder=new int[length-index-1];
		
		for(int i=0;i<rightSubPreOrder.length;i++){
			rightSubPreOrder[i]=preOrder[i+index+1];
		}
		
		root.right=buildTree(rightSubPreOrder, rightSubMidOrder);
		}
		return root;
	}
}