输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开
依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开
3 5 4 2 6 7 1 2 5 3 6 4 7 1
2 6 1 3 5 2 4 6 7 1 2 5 6 1 7 4 3
//层序遍历和中序遍历重建二叉树
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
class TreeNode{
int val = 0;
TreeNode left = null;
TreeNode right = null;
TreeNode(int val){
this.val = val;
}
}
private ArrayList<Integer> leaves = new ArrayList<Integer>();
private ArrayList<Integer> pre = new ArrayList<>();
private ArrayList<Integer> last = new ArrayList<>();
//找出数组中某个元素的坐标
public int findIndex(int[] array, int val){
for(int i = 0; i < array.length; i++){
if(array[i] == val)
return i;
}
return -1;
}
//重建二叉树
public TreeNode constructT(int[] layer, int[] mid){
if(layer.length == 0) return null;
if(layer.length == 1){
leaves.add(layer[0]);
TreeNode node = new TreeNode(layer[0]);
return node;
}
//根节点
int val = layer[0];
TreeNode root = new TreeNode(val);
//将中序遍历根据根节点分为左右两棵子树的中序遍历
int index = findIndex(mid, val);
if(index == 0)
root.left = null;
else{
int[] left = Arrays.copyOfRange(mid,0, index);
//在层序遍历数组layer中找出左子树的层序遍历数组
int[] layerl = new int[left.length];
for(int i = 0,j=0; i < layer.length&&j < left.length;i++){
if(findIndex(left,layer[i])!=-1){
layerl[j] = layer[i];
j++;
}
}
root.left = constructT(layerl,left);
}
if(index == mid.length-1)
root.right = null;
else{
int[] right = Arrays.copyOfRange(mid,index+1, mid.length);
//在层序遍历数组layer中找出右子树的层序遍历数组,为了节省时间,倒序查找
int[] layerr = new int[right.length];
for(int i = layer.length-1,j=right.length-1; i >=0&&j >=0;i--){
if(findIndex(right,layer[i])!=-1){
layerr[j] = layer[i];
j--;
}
}
root.right = constructT(layerr,right);
}
return root;
}
public void preOrder(TreeNode root){
if(root != null){
pre.add(root.val);
preOrder(root.left);
preOrder(root.right);
}
}
public void lastOrder(TreeNode root){
if(root != null){
lastOrder(root.left);
lastOrder(root.right);
last.add(root.val);
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String first = in.nextLine();
String second = in.nextLine();
String[] f = first.split(" ");
String[] s = second.split(" ");
if(s.length == 0){
System.out.println();
System.out.println();
System.out.println();
return;
}
int[] layer = new int[f.length];
int[] mid = new int[s.length];
for(int i = 0; i < f.length; i++){
layer[i] = Integer.valueOf(f[i]);
mid[i] = Integer.valueOf(s[i]);
}
Main m = new Main();
TreeNode root = m.constructT(layer,mid);
m.preOrder(root);
m.lastOrder(root);
for(int i = 0; i < m.leaves.size(); i++){
System.out.print(m.leaves.get(i)+" ");
}
System.out.println();
for(int i = 0; i < m.pre.size(); i++){
System.out.print(m.pre.get(i)+" ");
}
System.out.println();
for(int i = 0; i < m.last.size(); i++){
System.out.print(m.last.get(i)+" ");
}
System.out.println();
}
} import java.util.*;
class TreeNode{
int val;
TreeNode left = null;
TreeNode right = null;
TreeNode(int val) {this.val = val;}
}
public class Main{
public static void findLeaf(TreeNode root){
if (root == null) return;
TreeNode p = root;
ArrayList<TreeNode> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty()||p != null){
if (p != null){
stack.push(p);
p = p.left;
}
else {
p = stack.pop();
if (p.right == null&&p.left == null) list.add(p);
p = p.right;
}
}
for (int i=0;i<list.size();i++)
System.out.print(list.get(i).val+" ");
System.out.println();
}
public static void PrePrint(TreeNode root){
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root;
while (p != null||!stack.isEmpty()){
if (p != null){
System.out.print(p.val+" ");
stack.push(p);
p = p.left;
}
else {
p = stack.pop();
p = p.right;
}
}
System.out.println();
}
public static void PostPrint(TreeNode root){
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root, pL = root;
while (p != null){
stack.push(p);
p = p.left;
}
while (!stack.isEmpty()){
p = stack.pop();
if (p.right == null||pL == p.right){
System.out.print(p.val+" ");
pL = p;
}
else {
stack.push(p);
p = p.right;
while (p != null){
stack.push(p);
p = p.left;
}
}
}
System.out.println();
}
public static TreeNode reCon(int []lay, int []in){
if (lay.length == 0) return null;
TreeNode root = new TreeNode(lay[0]);
ArrayList<Integer> left = new ArrayList<>();
ArrayList<Integer> right = new ArrayList<>();
int head = 0;
for (;head < in.length;head++)
if (in[head] == lay[0])
break;
boolean leftTree = false;
for (int i=1;i<lay.length;i++){
leftTree = false;
for (int j=0;j<head;j++)
if (lay[i] == in[j]){
leftTree = true;
break;
}
if (leftTree) left.add(lay[i]);
else right.add(lay[i]);
}
int[] layleft = new int[left.size()];
int[] layright = new int[right.size()];
for (int i=0;i<left.size();i++)
layleft[i] = left.get(i);
for (int i=0;i<right.size();i++)
layright[i] = right.get(i);
root.left = reCon(layleft, Arrays.copyOfRange(in, 0, head));
root.right = reCon(layright, Arrays.copyOfRange(in, head+1, in.length));
return root;
}
public static void main(String []args){
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()){
String []laystr = sc.nextLine().split(" ");
String []instr = sc.nextLine().split(" ");
int []lay = new int[laystr.length];
int []in = new int[instr.length];
for (int i=0;i<in.length;i++){
lay[i] = Integer.valueOf(laystr[i]);
in[i] = Integer.valueOf(instr[i]);
}
TreeNode root = reCon(lay, in);
findLeaf(root);
PrePrint(root);
PostPrint(root);
}
}
}