题目链接:
二叉树重建问题,使用后序遍历和中序遍历构建二叉树,
主要思路是,首先找到根节点(即后序中的最后一个节点),然后用根节点将中序中的序列分为前后两个部分,再递归构建二叉树即可
AC代码如下:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int N;
static int[] post;
static int[] in;
static Node root;
static ArrayList<Node> cenxu=new ArrayList<Node>();
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
post=new int[N];
in=new int[N];
for(int i=0;i<N;i++)
post[i]=sc.nextInt();
for(int i=0;i<N;i++)
in[i]=sc.nextInt();
Node root=f(0,0,N);
print(root);
}
public static Node f(int a,int b,int n){
if(n<=0) return null;
Node root=new Node(post[a+n-1]);
root.lChild=null;
root.rChild=null;
int i;
for(i=0;i<n;i++)
if(in[b+i]==root.data)
break;
root.lChild=f(a,b,i);
root.rChild=f(a+i,b+i+1,n-i-1);
return root;
}
public static void print(Node root){
ArrayList<Node> ar=new ArrayList<Node>();
ar.add(root);
while(ar.size()!=0){
Node node=ar.get(0);
if(node.lChild!=null)
ar.add(node.lChild);
if(node.rChild!=null)
ar.add(node.rChild);
cenxu.add(node);
ar.remove(0);
}
for(int i=0;i<cenxu.size()-1;i++)
System.out.print(cenxu.get(i).data+" ");
System.out.print(cenxu.get(cenxu.size()-1).data);
}
}
class Node{
int data;
Node lChild;
Node rChild;
Node(int data){
this.data=data;
}
}