根据一棵树的中序遍历与后序遍历构造二叉树。

/*
 * 根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7
 * 
 */

import java.util.Arrays;

public class TreeNode{
	int data;
	
	public TreeNode (int data) {
		this.data=data;
	}
	  
	public static void buildTree(int[] inorder,int[] postorder){
		
		if(inorder.length==0 || postorder.length==0)
		{
			return ;
		}
		
		//根据后序遍历可找出根节点
		int data=postorder[postorder.length-1];
		TreeNode  root = new TreeNode(data);
		System.out.println("先序遍历依次打印结点:"+root.data);
		
		//找出根在数组中的索引
		int rootIndex = 0;
		int i=0;
		while(i<inorder.length)
		{
			if(inorder[i]==root.data)
			{
				rootIndex=i;
				break;
			}
			else {
				i++;
			}
		}
		
		//划分左子树的中序和后序
		int[] leftinorder= Arrays.copyOfRange(inorder, 0, rootIndex);
		int[] leftpostorder= Arrays.copyOfRange(postorder, 0, rootIndex);
		buildTree(leftinorder,leftpostorder);
		
		//划分右子树的中序和后序
		int[] rightinorder= Arrays.copyOfRange(inorder,rootIndex+1,inorder.length);
		int[] rightpostorder=Arrays.copyOfRange(postorder,rootIndex,postorder.length-1);
		buildTree(rightinorder,rightpostorder);
		
	}
	
	public static void main(String[] args) {
		int[] inorder={9,3,15,20,7};
		int[] postorder={9,15,7,20,3};
		buildTree(inorder,postorder);
	}
}





你可能感兴趣的:(根据一棵树的中序遍历与后序遍历构造二叉树。)