样例输入:
6
中序:3 2 4 1 6 5
后序:3 4 2 6 5 1
样例输出:
前序:1 2 3 4 5 6
import javax.swing.tree.TreeNode;
import java.util.Scanner;
/*
前序:根左右
中序:左根右
后序:左右根
*/
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] inorder = new int[n];
int[] postorder = new int[n];
for (int i = 0; i<n; i++)inorder[i] = sc.nextInt();
for (int i = 0; i<n; i++)postorder[i] = sc.nextInt();
TreeNode root = creatroot(inorder,postorder);
preorder(root);
}
private static void preorder(TreeNode root) {
if(root == null)return;
System.out.print(root.val+" ");
preorder(root.left);
preorder(root.right);
}
private static TreeNode creatroot(int[] inorder, int[] postorder) {
return BuildTree(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
}
private static TreeNode BuildTree(int[] inorder, int si, int ei, int[] postorder, int sp, int ep) {
if(si>ei||sp>ep)return null;
int rootval = postorder[ep];
TreeNode root = new TreeNode(rootval);
for(int i = si; i<ei; i++){
if(inorder[i] == rootval){//左子树从前开始,右子树从后开始
TreeNode left = BuildTree(inorder,si,i-1,postorder,sp,sp-(si-i+1));
TreeNode right = BuildTree(inorder,i+1,ei,postorder,ep-(ei-i),ep-1);
root.left = left;
root.right = right;
}
}
return root;
}
public static class TreeNode{
int val;
TreeNode left ;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
}