子树层序遍历的序列结果,与父树层序遍历结果中的相对位置相同:
import java.util.*; class Tree{ int val; Tree left, right; Tree(int a){val = a;} } public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] str1 = sc.nextLine().split(" "); String[] str2 = sc.nextLine().split(" "); List<Integer> v1 = new ArrayList<>(); List<Integer> v2 = new ArrayList<>(); for(int i = 0; i < str1.length; ++i) v1.add(Integer.valueOf(str1[i])); for(int i = 0; i < str2.length; ++i) v2.add(Integer.valueOf(str2[i])); Tree r = f(v1, v2);//先把这棵树求出来 p(y(r));//p是打印方法,y是叶节点方法 p(g(r));//g是先序方法 p(h(r));//h是后序方法 } public static Tree f(List<Integer> v1, List<Integer> v2){//求出这棵树 if(v1.isEmpty() || v2.isEmpty()) return null; Tree r = new Tree(v1.get(0));//层序的第一个节点就是根节点 int temp = v2.indexOf(v1.get(0));//找出根节点在中序的位置 List<Integer> v11 = new ArrayList<>();//左子树的层序 List<Integer> v12 = new ArrayList<>();//右子树的层序 List<Integer> v21 = v2.subList(0, temp);//中序根左边是左子树 List<Integer> v22 = v2.subList(temp + 1, v2.size());//中序根右边是右子树 for(int i = 1; i < v1.size(); ++i){ if(v21.contains(v1.get(i))) v11.add(v1.get(i));//左子树的层序 } for(int i = 1; i < v1.size(); ++i){ if(v22.contains(v1.get(i))) v12.add(v1.get(i));//右子树的层序 } r.left = f(v11, v21); r.right = f(v12, v22); return r; } public static List<Integer> g(Tree r){//先根遍历 List<Integer> v = new ArrayList<>(); if(r == null) return v; v.add(r.val);//先根 for(Integer i : g(r.left)) v.add(i); for(Integer i : g(r.right)) v.add(i); return v; } public static List<Integer> h(Tree r){//后根遍历 List<Integer> v = new ArrayList<>(); if(r == null) return v; for(Integer i : h(r.left)) v.add(i); for(Integer i : h(r.right)) v.add(i); v.add(r.val);//后根 return v; } public static List<Integer> y(Tree r){//求叶节点 List<Integer> v = new ArrayList<>(); if(r == null) return v; if(r.left == null && r.right == null) v.add(r.val);//叶节点左右皆空 for(Integer i : y(r.left)) v.add(i); for(Integer i : y(r.right)) v.add(i); return v; } public static void p(List<Integer> v){ if(v.isEmpty()) return; System.out.print(v.get(0));//打印第一个 for(int i = 1; i < v.size(); ++i){ System.out.print(" "); System.out.print(v.get(i)); } System.out.println();//打完记得换行 } }