PAT Advanced Level 1020. Tree Traversals (25)
这道题目是由,
《编程之美》——3.9、重建二叉树 and 3.10、分层遍历二叉树
改编过来的。
详见我的另一篇博客:http://blog.youkuaiyun.com/u010388829/article/details/39135695
postOrder 后序遍历结果: 2 3 1 5 7 6 4 ,可知其最后一个节点 4 就是整棵树的Root
inOrder 中序遍历结果: 1 2 3 4 5 6 7 ,在其中找到 4 ,则可将整个数组分为左右两部分,左边的即为左子树,右边的右子树。
递归。根据后序遍历,中序遍历结果 , 递归,生成整棵树。
然后使用Queue进行一层一层地遍历。即方法 traversalByLevel(Node root)
Java代码 :
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static Main instance =new Main();
static int n ;
public static void main(String[] arg){
Scanner sc =new Scanner (System.in);
n =Integer.parseInt(sc.nextLine());
int[] postOrder =new int[n];
int[] inOrder =new int[n];
String[] arr1 =sc.nextLine().trim().split(" ");
String[] arr2 =sc.nextLine().trim().split(" ");
for(int i=0;i<n;i++){
postOrder[i]=Integer.parseInt(arr1[i]);
inOrder[i] =Integer.parseInt(arr2[i]);
}
Node root =instance.new Node(postOrder[n-1]);
buildTree(postOrder,inOrder,n-1,n-1,n,root);
traversalByLevel(root);
}
public static Node buildTree(int[] postOrder , int[] inOrder,
int pPostOrder, int pInorder,
int treeLen , Node root){
if(root ==null){
root =instance.new Node(postOrder[pPostOrder]);
}
if(treeLen == 1 ){
return root;
}
int pInorder_bak =pInorder;
while(postOrder[pPostOrder] !=inOrder[pInorder]){
if(pInorder_bak-pInorder>n){
break;
}
pInorder--;
}
int rightLen = pInorder_bak -pInorder ;
int leftLen = treeLen -rightLen -1;
if(rightLen>0){
root.right =buildTree(postOrder, inOrder, pPostOrder-1, pInorder_bak, rightLen, null);
}
if(leftLen>0){
root.left = buildTree(postOrder, inOrder, pPostOrder-1-rightLen, pInorder_bak-1-rightLen, leftLen,null);
}
return root;
}
static Queue<Node> queue =new LinkedList<Node>();
public static void traversalByLevel(Node root){
if(root == null){
return ;
}
queue.add(root);
while(!queue.isEmpty()){
if(queue.peek().left!=null){
queue.add(queue.peek().left);
}
if(queue.peek().right!=null){
queue.add(queue.peek().right);
}
System.out.print(queue.poll().val);
if(!queue.isEmpty()){
System.out.print(" ");
}
}
}
class Node{
int val;
Node left;
Node right;
public Node(int value){
val =value;
left =null;
right =null;
}
}
}